Winform中控制文本框输入的值(只显示允许输入类型的值)

  在工作中,文本框TextBox控件是普遍使用的一个输入/显示的控件,很多时候我们作为开发者,根据业务的要求,并不想让客户在文本框中输入一些奇怪的东西,毕竟某些情况下,输入完成之后再进行文本校验是比较复杂且实现费事的一件事,所以就需要对输入的值直接进行校验,只允许输入符合要求的值,不符合要求的值,即使按下了键,也不在文本框中显示。

  首先,建一个winform窗体,放置一个TextBox控件。

  接下来为TextBox添加事件,主要是通过KeyDown和KeyPress来实现,KeyDown在KeyPress之前执行。

  Designer.cs中代码

this.testTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(testTextBox_KeyDown);
this.testTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(testTextBox_KeyPress);
this.testTextBox.TextChanged += new System.EventHandler(testTextBox_TextChanged);

  窗体的cs中代码,该例子中只允许输入数字0-9,允许进行ctrl+A全选,ctrl+C复制,ctrl+X剪切,ctrl+V粘贴,并且会对粘贴的内容进行校验,如何全部是数字才会粘贴成功,并且可以删除backspace和回车enter

//指示输入的值是否符合要求
private bool _isInputOk;
//指示文本框是否发生了TextChanged事件
private bool _isTextChanged;

  KeyDown函数

private void testTextBox_KeyDown(object sender, KeyEventArgs e)
{
    _isInputOk = true;
    //ctrl + A , ctrl + C , ctrl + X
    if (e.KeyData == (Keys.A | Keys.Control) ||
        e.KeyData == (Keys.C | Keys.Control) ||
        e.KeyData == (Keys.X | Keys.Control))
    {
        return;
    }
    //ctrl + V
    if (e.KeyData == (Keys.V | Keys.Control))
    {
         //剪贴板中是否有数据
        if (Clipboard.ContainsText())
        {
            if (Regex.IsMatch(Clipboard.GetText(), @"^\d+$"))
            {
                return;
            }
            else
            {
                _isInputOk = false;
            }
        }
    }
    //输入键盘上的数字0-9(包括小键盘)
    if ((!e.Shift && e.KeyValue >= (char)Keys.D0 && e.KeyValue <= (char)Keys.D9) ||
        (!e.Shift && e.KeyValue >= (char)Keys.NumPad0 && e.KeyValue <= (char)Keys.NumPad9))
    {
        return;
    }
    //Backspace
    if (e.KeyData == Keys.Back)
    { 
return; } //Enter if (e.KeyData == Keys.Enter) { return; } _isInputOk = false;
}

  KeyPress函数

//后触发
private void testTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
    if (!_isInputOk)
    {
        e.Handled = true;
        return;
    }
    //在文本框中点击了Enter按钮
    if (e.KeyChar == (char)Keys.Enter && _isTextChanged)
    {
        //todo 所需要的业务
    }

    _isTextChanged = false;
}

 

posted @ 2019-12-02 22:00  冬天从来不怕冷  阅读(708)  评论(0编辑  收藏  举报