Замена и запрет символов в TextBox?
Есть текстбокс, в который я могу ввести только цифры и запятую. Т.к. запятая нужна в качестве разделителя — она может писаться только раз.
Соответственно, если вводится точка — ее надо заменить на запятую. Получился такой код:
private: System::Void aPredelText_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) < if ((e->KeyChar >= '0')&&(e->KeyChar if (e->KeyChar == '.') < e->KeyChar = ','; > if (e->KeyChar == ',') < if (aPredelText->Text->IndexOf(',') != -1) < e->Handled = true; > return; > if (Char::IsControl(e->KeyChar)) < if (e->KeyChar == (char) Keys::Enter) otvetButton->Focus(); return; > e->Handled = true; >
Компиляция проходит без ошибок, но в итоге ничего не меняется, все так же можно вводить любые символы и точка не меняется. Как можно решить эту проблему?
- Вопрос задан более трёх лет назад
- 8104 просмотра
Комментировать
Решения вопроса 1

Алексей Немиро @AlekseyNemiro
full-stack developer
private: System::Void aPredelText_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) < // точка или запятая if(e->KeyChar == '.' || e->KeyChar == ',') < // жесткая запятая e->KeyChar = ','; // может уже имеем один разделитель if (aPredelText->Text->IndexOf(',') != -1) < e->Handled = true; return; > > // не управляющая клавиша, не число и не разделитель if(!Char::IsControl(e->KeyChar) && !Char::IsDigit(e->KeyChar) && e->KeyChar != ',') < e->Handled = true; return; > >
Ответ написан более трёх лет назад
Нравится 1 3 комментария
Запрет ввода русских символов
Для того чтобы запретить ввод каких-либо символов сделайте фильтрацию ввода при обработке события PreviewTextInput .
Ниже приведён пример того как с помощью данного события можно разрешить ввод в textBox только для цифр.
private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
Для того чтобы его доработать под Вашу задачу достаточно добавить проверку, является ли вводимый символ латинским. Пример такой проверки можно посмотреть в этом вопросе: «Определить, является ли символ в строке латинским».
Отслеживать
ответ дан 7 фев 2016 в 23:44
11.7k 9 9 золотых знаков 28 28 серебряных знаков 40 40 бронзовых знаков
через CTRL+V можно вставить что угодно, как это можно обойти не запрещая комбинации клавиш?
8 фев 2016 в 23:07
Возможно это не ререшение, но как способ, то при выполнении эвента textChanged , или того, что ты задашь, который вызывается при введении текста, то при вводе символа, берешь весь string , выбераешь последний символ и смотришь, есть ли он в диапазоне
if(ch ='а' || ch>='A' && ch<='Я') textBox.Text.Remove(textBox.Text.Lenght-1);
Как-то так, только, возможно, я с методами ошибся, так что исправь.
Возможной проблемой этого может стать то, что при вводе кириллицы, она появиться в textBox , но после этого сразу же пропадет. В крайнем случае при коммите действия связаного с textBox , ты можешь создать StringBuilder , пройтись по символах, ну и если есть хоть один, то выдавать MessageBox с ошибкой.
Ввод в TextBox только цифр и английских символов
Как наиболее правильно запретить ввод в TextBox символов любой раскладки кроме английской и цифр. Желательно не сравнивая в цикле каждый символ строки с шаблоном.
private void validationTextBox_KeyDown(object sender, KeyEventArgs e) < TextBox a = (TextBox)sender; if (e.Key < Key.D0 || e.Key >Key.F) e.Handled = true; //code >
Отслеживать
задан 12 апр 2017 в 15:36
329 2 2 серебряных знака 13 13 бронзовых знаков
А что не так с кодом, который вы привели?
12 апр 2017 в 15:45
(За исключением странно заданного и скорее всего неправильного диапазона)
12 апр 2017 в 15:46
@VladD Он работает, но допускает ввод символов на любой раскладке
12 апр 2017 в 15:54
Ага, понял. Сейчас гляну.
12 апр 2017 в 15:55
Да, а что вы хотите делать с Ctrl-V?
12 апр 2017 в 15:56
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
У меня работает код, основанный на этом ответе:
void OnPreviewTextInput(object sender, TextCompositionEventArgs e) < e.Handled = !e.Text.All(IsGood); >private void OnPasting(object sender, DataObjectPastingEventArgs e) < var stringData = (string)e.DataObject.GetData(typeof(string)); if (stringData == null || !stringData.All(IsGood)) e.CancelCommand(); >bool IsGood(char c) < if (c >= '0' && c = 'a' && c = 'A' && c
Вставка работает, если в ней нет запрещённых символов.
Отслеживать
ответ дан 12 апр 2017 в 16:18
207k 28 28 золотых знаков 293 293 серебряных знака 526 526 бронзовых знаков
[DllImport("user32.dll", SetLastError = true)] private static extern int GetWindowThreadProcessId( [In] IntPtr hWnd, [Out, Optional] IntPtr lpdwProcessId ); [DllImport("user32.dll", SetLastError = true)] private static extern IntPtr GetForegroundWindow(); [DllImport("user32.dll", SetLastError = true)] private static extern ushort GetKeyboardLayout( [In] int idThread ); private int GetKeyboardLayout() < return GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero)); >private void validationTextBox_KeyDown(object sender, KeyEventArgs e) < TextBox a = (TextBox)sender; if (e.Key >= Key.D0 && e.Key = Key.A && e.Key else e.Handled = true; >
Отслеживать
ответ дан 12 апр 2017 в 16:09
329 2 2 серебряных знака 13 13 бронзовых знаков
1033? А если ввод на французской локали?
12 апр 2017 в 16:20
У французкой 1036 код, msdn.microsoft.com/ru-ru/library/hh825684.aspx
12 апр 2017 в 16:26
Ну это да, но ваш код не примет цифры ни на французской, ни на немецкой, ни на китайской локали.
12 апр 2017 в 16:27
@VladD Спасибо, исправил, теперь принимает
12 апр 2017 в 16:31
Окей, а букву a на французской локали принимает?
12 апр 2017 в 17:16
- c#
- .net
- wpf
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.12.7.2316
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Программирование на C, C# и Java
Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы
ОСТОРОЖНО МОШЕННИКИ! В последнее время в соиальных сетях учстились случаи педложения помощи в написании прогамм от лиц, прикрвающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в псторонних группах ВК. Для связи с нами используйте исключительно эти контакт: vscoderu@yandex.ru, https://vk.com/vscode
Ввод в TextBox только цифр и необходимых символов C#
Здравствуйте, очень часто начинающие программисты задают вопрос, как вводить в TextBox только цифры или другие необходимые им символы, игнорируя все остальные. В этой статье мы рассмотрим несколько самых простых и полезных способ решения этой проблемы.
Для этого мы создадим тестовый проект для наглядного примера с одним лишь текстбоксом, у нас он вот такой:

Перво-наперво нам необходимо найти событие, благодаря которому сможем отследить нажатие определенных клавиш. Таким событием является KeyPress. Оно будет происходить всегда, когда пользователь нажимает на любую кнопку на клавиатуре. Чтобы перейти к нему, надо для начала выделить TextBox, один раз щёлкнув на него левой кнопкой мыши.

Затем следует найти в правой стороне рабочей области Visual Studio окно «Свойства» и перейти в нём на вкладку событий (значок в виде молнии):

Примечание: если вы не нашли «Свойства», то просто кликните правой кнопкой мыши по текстбоксу и выберете в появившемся меню соответствующую вкладку.
Далее мы ищем событие KeyPress и дважды нажимаем на него левой кнопкой мыши. Нас перенесет к коду этого события. Далее мы рассмотрим несколько вариантов решения проблемы с вводом определенных символов в TextBox. Сначала будут идти варианты только с выводом цифр, а затем и другие (с Backspace, пробелом, запятой и проч.)
Использование в TextBox только цифр.
Способ первый — самый быстрый.
Внутри этой области кода мы запишем всего несколько строк: