Справочник по C#

    Исходники по языку программирования CSharp

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

    /
    /
    /
    146 Views


         На сайте уже присутствует инструкция с примерами по реализации задачи ввода в элемент управления «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;

          Запустите созданный проект и попробуйте вставить число с буквами из системного буфера обмена, компонент обнаружит событие вставки из системного буфера обмена и выполнит проверку данных. Если входные состоят только из цифр, элемент управления разрешит вставку.

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

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

    0.00 (0%) 0 votes

    moyadcode13
    • Facebook
    • Twitter
    • Google+
    • Linkedin
    • Pinterest
    moyadcode10
    moyadcode11
    moyadcode9