Ввод в Textbox только цифр. Часть 2. Буфер Обмена

     На сайте уже присутствует инструкция с примерами по реализации задачи ввода в элемент управления «TextBox» только цифр (Ввод в Textbox только цифр), но каждый из них содержит единственный недостаток, это отсутствие проверки данных при вставке из буфера обмена. Для его устранения необходимо организовать перехват события вставки из буфера обмена с использованием метода «Control.WndProc», обрабатывающего сообщения Windows и выполнить проверку этих данных на содержание только цифр.
Более подробную информацию по данному методу, вы можете получить с сайта Microsoft MSDN.
      В следующем примере кода показано переопределение метода «WndProc» для обработки сообщений операционной системы, определяемых в структуре «Message». Вставка из буфера обмена осуществляется при помощи сообщения «WM_PASTE», чтобы проверить данные перед вставкой в элемент управления «TextBox», необходимо отловить это сообщение и проверить содержимое буфера обмена.
public partial class DigitTextBox : TextBox
{
    const int WM_PASTE = 0x0302;
    protected override void WndProc(ref Message m)
    {            
        if (m.Msg == WM_PASTE)
        {
            //здесь необходимо выполнить 
            //проверку данных
        }

        base.WndProc(ref m);
    }
}
      Для проверки данных содержащихся в буфере обмена необходимо их извлечь, воспользовавшись методом «Clipboard.GetDataObject», который извлекает данные, которые находятся в данный момент в системном буфере обмена. После извлечения данных, их необходимо проверить на соответствие стандартному текстовому формату ANSI.
IDataObject data = Clipboard.GetDataObject();
if (data != null && data.GetDataPresent(DataFormats.Text))
{
    //Если данные в буфере 
    //обмена имеют стандартный текстовый
    //формат ANSI.
}
      В случае если проверка данных выполнена успешно, с использованием цикла «For» выполняется посимвольный перебор входной строки и проверкой каждого символа на принадлежность к числу.
string s = (string)data.GetData(DataFormats.Text);                   
for (int i = 0; i < s.Length; i++)
{                       
    if (!System.Text.RegularExpressions.Regex.IsMatch(s[i].ToString(), @"\d+"))
    {
        return;
    }
}
      Ниже представлен полный класс элемента управления «TextBox», в котором реализована данная проверка.
public partial class MyTextBox : TextBox
{
    const int WM_PASTE = 0x0302;
    protected override void WndProc(ref Message m)
    {            
        if (m.Msg == WM_PASTE)
        {
            IDataObject data = Clipboard.GetDataObject();
            if (data != null && data.GetDataPresent(DataFormats.Text))
            {
                string s = (string)data.GetData(DataFormats.Text);                   
                for (int i = 0; i < s.Length; i++)
                {                       
                    if (!System.Text.RegularExpressions.Regex.IsMatch(s[i].ToString(), @"\d+"))
                    {
                       return;
                    }
                }  
            }
        }
        base.WndProc(ref m);
    }
}
      Чтобы воспользоваться данным классом, добавьте элемент управления «TextBox» из панели управления на главную форму вашего проекта и перейдите в ее листинг, нажав на клавиатуре клавишу «F7». Вставьте данный класс, под основным классом главной формы (public partial class Form1 : Form).
      Перейдите в Обозреватель решений и найдите файл Form1.Designer. Сделайте двойной клик по нему левой клавишей мыши.
      У вас откроется новая вкладка содержащая листинг, автоматически созданный конструктором форм.
      Найдите метод инициализации элементов формы «InitializeComponent» и найдите код объявления элемента управления «TextBox». Замените стандартный класс «System.Windows.Forms.TextBox();» данного элемента, на класс добавленный в главную форму - «DigitTextBox()».
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
this.textBox1 = new DigitTextBox();//System.Windows.Forms.TextBox();
this.SuspendLayout();
// 
// textBox1
// 
this.textBox1.Location = new System.Drawing.Point(12, 23);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(431, 20);
this.textBox1.TabIndex = 0;
      Запустите созданный проект и попробуйте вставить число с буквами из системного буфера обмена, компонент обнаружит событие вставки из системного буфера обмена и выполнит проверку данных. Если входные состоят только из цифр, элемент управления разрешит вставку.

Ссылка для скачивания примера: Яндекс.Диск


5 комментариев:

  1. твоя прога не работает, туфта....

    ОтветитьУдалить
  2. Здравствуйте! у меня такая проблема как можно создать поиск по дате? чтоб искал в Datagridview выводил только то что вводил. заранее спасибо!

    ОтветитьУдалить
  3. Здравствуйте, вы хотите сделать поиск по столбцу с датами или поиск всех дат в таблице?

    ОтветитьУдалить
  4. я хочу создать поиск по столбцу

    ОтветитьУдалить
  5. Вот готовый пример: http://csharpcoderr.rusfolder.net/files/40965607

    ОтветитьУдалить

Большая просьба, не писать в комментариях всякую ерунду не по теме!