Как сделать TextBox, позволяющий вводить только цифры?

Переопределите метод 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);
  }
}
Реклама


Вернуться на главную страницу