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