На сайте уже присутствует инструкция с примерами по реализации задачи ввода в элемент управления «TextBox» только цифр (Ввод в Textbox только цифр), но каждый из них содержит единственный недостаток, это отсутствие проверки данных при вставке из буфера обмена. Для его устранения необходимо организовать перехват события вставки из буфера обмена с использованием метода «Control.WndProc», обрабатывающего сообщения Windows и выполнить проверку этих данных на содержание только цифр.
Перейдите в Обозреватель решений и найдите файл Form1.Designer. Сделайте двойной клик по нему левой клавишей мыши.
У вас откроется новая вкладка содержащая листинг, автоматически созданный конструктором форм.
Найдите метод инициализации элементов формы «InitializeComponent» и найдите код объявления элемента управления «TextBox». Замените стандартный класс «System.Windows.Forms.TextBox();» данного элемента, на класс добавленный в главную форму - «DigitTextBox()».
Более подробную информацию по данному методу, вы можете получить с сайта 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;Запустите созданный проект и попробуйте вставить число с буквами из системного буфера обмена, компонент обнаружит событие вставки из системного буфера обмена и выполнит проверку данных. Если входные состоят только из цифр, элемент управления разрешит вставку.
Ссылка для скачивания примера: Яндекс.Диск
твоя прога не работает, туфта....
ОтветитьУдалитьЗдравствуйте! у меня такая проблема как можно создать поиск по дате? чтоб искал в Datagridview выводил только то что вводил. заранее спасибо!
ОтветитьУдалитьЗдравствуйте, вы хотите сделать поиск по столбцу с датами или поиск всех дат в таблице?
ОтветитьУдалитья хочу создать поиск по столбцу
ОтветитьУдалитьВот готовый пример: http://csharpcoderr.rusfolder.net/files/40965607
ОтветитьУдалить