在工作中,文本框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; }