Переопределите метод TextBox.OnKeyPress, проверяйте KeyPressEventArgs.KeyChar и если это не цифра, выставляйте свойство KeyPressEventArgs.Handled в значение true. Однако, если делать проверку на вводимые символы только в этом методе, то пользователь сможет вставить какую угодно строку из буфера обмена, поэтому нужно отлавливать такие ситуации и проверять вставляемую строку. Все сказанное выше выполняет класс DigitTextBox, представленный ниже.
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Text.RegularExpressions;
class DemoForm: Form
{
public DemoForm()
{
DigitTextBox box = new DigitTextBox();
box.Parent = this;
}
static void Main()
{
Application.Run(new DemoForm());
}
}
class DigitTextBox: TextBox
{
const int WM_PASTE = 0x0302;
const string NumberTemplate = @"^\d+$";
protected override void OnKeyPress(KeyPressEventArgs e)
{
switch((Keys)e.KeyChar)
{
case Keys.D0:
case Keys.D1:
case Keys.D2:
case Keys.D3:
case Keys.D4:
case Keys.D5:
case Keys.D6:
case Keys.D7:
case Keys.D8:
case Keys.D9:
case Keys.Back:
e.Handled = false;
break;
default:
e.Handled = true;
break;
}
base.OnKeyPress (e);
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_PASTE)
{
string data = Clipboard.GetDataObject().GetData(DataFormats.Text) as string;
if (!Regex.IsMatch(data, NumberTemplate))
return;
}
base.WndProc (ref m);
}
}
Вернуться на главную страницу