现在还有一点问题
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = (e.KeyChar < '0' || e.KeyChar > '9');
            if (e.KeyChar ==(char ) Keys.Back )
            {
                //允许BackSpace
                e.Handled = false;
            }
        }这个语句屏蔽掉了字符,对于汉字和复制粘贴还是不可以。这个好象可以屏蔽掉汉字输入和粘贴问题。
public const int WM_PASTE = 0x0302;//粘貼消息 
protected override void WndProc(ref Message m) 
{
    if(m.Msg != WM_PASTE)base.WndProc (ref m);
}
有谁有更好的方法讲解一下。 
先谢谢了/

解决方案 »

  1.   

    用正则表达式..在TextBox失去焦点或者TextChanged时作下判断...
      

  2.   

    如果要想做的严禁一些,最好是继承一个新的TextBox类,如下的就是一个,楼主可以测试:
    /// <summary>
    /// 只能对数值操作的TextBox。
    /// </summary>
    public class TextBoxNumEx : System.Windows.Forms.TextBox
    {
    public TextBoxNumEx()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    }
    protected override void WndProc(ref Message m)
    {
    switch (m.Msg)
    {
    case 0x0102:
    bool isSign = ((int)m.WParam == 45);
    bool isNum = ((int)m.WParam >= 48) && ((int)m.WParam <= 57);
    bool isBack = (int)m.WParam == (int)Keys.Back;
    bool isDelete = (int)m.WParam == (int)Keys.Delete;
    bool isCtr = ((int)m.WParam == 24) || ((int)m.WParam == 22) || ((int)m.WParam == 26) || ((int)m.WParam == 3); if (isNum || isBack || isCtr)
    {
    base.WndProc(ref m);
    }
    if (isSign)
    {
    if (this.SelectionStart != 0)
    {
    break;
    }
    base.WndProc(ref m);
    break;
    }
    if (isDelete)
    {
    if (this.Text.IndexOf(".") < 0)
    {
    base.WndProc(ref m);
    }
    }
    if ((int)m.WParam == 1)
    {
    this.SelectAll();
    }
    break;
    case 0x0302:
    IDataObject iData = Clipboard.GetDataObject();//取剪贴板对象 if (iData.GetDataPresent(DataFormats.Text)) //判断是否是Text
    {
    string str = (string)iData.GetData(DataFormats.Text);//取数据
    if (MatchNumber(str))
    {
    base.WndProc(ref m);
    break;
    }
    }
    m.Result = (IntPtr)0;//不可以粘贴
    break;
    default:
    base.WndProc(ref m);
    break;
    }
    }
    private bool MatchNumber(string numberText)
    {
    if (string.IsNullOrEmpty(numberText))
    {
    return false;
    } int index = 0;
    string strNum = "-0.123456789"; index = numberText.IndexOf(strNum[0]);
    if (index >= 0)
    {
    if (numberText.Length == 1 || numberText.IndexOf(strNum[0], index + 1) > 0)
    {
    return false;
    }
    }
    index = numberText.IndexOf(strNum[2]);
    if (index != -1)
    {
    index = numberText.IndexOf(strNum[2], index + 1);
    if (index != -1)
    {
    return false;
    }
    }
    return true;
    }
    }
      

  3.   

    楼主的意思是只允许输入数字吗?我以前写过一个程序里是用正则在textchanged事件里判断的,效果挺好的,楼主可以试下,不会有汉字和粘贴的问题
     private void textBox1_TextChanged(object sender, EventArgs e)
            {
                //判断输入是否为数字,是则显示,否则清空
                Regex r = new Regex("^[0-9]+$");
                if (!r.IsMatch (textBox1.Text))
                {
                    txtLineNumber.Text = "";            }
            }
      

  4.   

    哦,txtLineNumber.Text = "";这里txtLineNumber应该是textBox1,忘了改,延用了我程序里的名称了
      

  5.   

    <asp:TextBox ID="TextBox1" runat="server" onPaste="return false"  onDrop="return false" MaxLength="20"></asp:TextBox>// onPaste="return false"  禁止复制
    //onDrop="return false"    禁止拖拉
      

  6.   

    上面 MaxLength="20"忘了去掉,
    <asp:TextBox ID="TextBox1" runat="server" onPaste="return false"  onDrop="return false"></asp:TextBox>
      

  7.   

    lxcnn(过客)  是用正则表达式吧。 挺好
    但是有点视觉残影。hbxtlhx(平民百姓) 这个可以, 但是看着有点费劲。 有高手讲解一下吗?让大家都明白一下/
      

  8.   

    其实代码看上去是挺多的,但是实现上好理解也比较实用.主要的思路就是在TextBox处理我们不希望它处理的消息之前来自己处理这些消息了.
    代码中没有用到任何API,只是把消息接过来了.比如我们发现TextBox在将要处理的按键消息(比如A或"我"等)时发现这个按键我们不想让它出现在Textbox里,那么我们就不要把这时的消息m(Message)传到基类的WndProc方法中,这样基类就不会处理这个消息了,自然就不出在文本框里出现这个按键了.但是并不是所有的消息都不要base.WndProc来处理,比如粘贴文本的消息我们还是要base.WndProc来处理的,怎么办呢,这就用到了消息的返回值m.Result,在粘贴的消息中如果这个值为0则不处理粘贴了.这样也就不会出现在TextBox上了.总的说来合适的处理base.WndProc就会得到我们想要的某种效果.
      

  9.   

    是不是应该这样理解的。
    WndProc 是一个窗口过程函数,他接收当前使用控件的消息和事件处理方法,
    过程函数 protected override void WndProc(ref Message m) 
    中的m.msg  就是获取消息的标识符。 所有控件的所有消息和事件处理方法都是通过 WndProc处理的。 不同的控件有不同的WndProc 是吗?
      

  10.   

    WndProc 是一个窗口过程函数,所有的事件和消息处理方法都通过它提交到消息队列中。
    上面的例子就是将 m.msg  判断一下,满足提交条件的话操作,否则不提交消息队列中