Пытаюсь создать калькулятор на Windows Forms, С#. Добавил кнопки для ввода чисел и следовательно требуется ограничить ввод пользователя в TextBox.
Рассматриваю 2 варианта:
- Полностью ограничить ввод пользователя с клавиатуры.
- Ограничить ввод только для символов и букв.
НО, хоть сколько я буду рассматривать я не знаю как реализовать ни то, ни это. Прошу помочь.
задан 17 ноя 2017 в 21:22
4
Используй свойство TextBox.ReadOnly
:
TextBox.ReadOnly = true;
ответ дан 17 ноя 2017 в 21:45
Volodymyr RetsVolodymyr Rets
2,41713 серебряных знаков26 бронзовых знаков
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if ((e.KeyChar >= '0') && (e.KeyChar <= '9') || (e.KeyChar == '-') ||(e.KeyChar == '.'))
{
return;
}
e.Handled = true;
}`
числа от 0 до 9 знак минуса и и точка, можно также добавить другие знаки, можно числа через if, а знаки через switch/case.
e.Handled = true; — запрещает ввод символов
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
switch (e.KeyChar)
{
case '-':
return;
case '+':
return;
}
e.Handled = true;
}
ответ дан 8 июл 2022 в 12:21
Yekaterin@ 1 / 1 / 0 Регистрация: 22.11.2010 Сообщений: 27 |
||||
1 |
||||
18.05.2012, 19:10. Показов 149260. Ответов 60 Метки нет (Все метки)
Как запретить ввод букв в textBox? Вот эта конструкция неверно работает
1 |
emdroof 6 / 6 / 0 Регистрация: 11.04.2011 Сообщений: 88 |
||||
18.05.2012, 19:34 |
2 |
|||
количество введенных символов будет зависеть от типа textbox
4 |
1 / 1 / 0 Регистрация: 22.11.2010 Сообщений: 27 |
|
18.05.2012, 19:45 [ТС] |
3 |
теперь он не только на буквы ругается, но и когда числа ввожу
0 |
6 / 6 / 0 Регистрация: 11.04.2011 Сообщений: 88 |
|
18.05.2012, 19:51 |
4 |
ругаться не должен, у меня не ругается, а сколько чисел вводишь?потому что int имеет свои пределы
0 |
1 / 1 / 0 Регистрация: 22.11.2010 Сообщений: 27 |
|
18.05.2012, 19:54 [ТС] |
5 |
все, я уже исправила, спасибо)
0 |
Заблокирован |
|
18.05.2012, 20:18 |
6 |
А как ты исправила? а то у меня такая же фигня щас, не дает ввести цифры(
0 |
Yekaterin@ 1 / 1 / 0 Регистрация: 22.11.2010 Сообщений: 27 |
||||
18.05.2012, 20:27 [ТС] |
7 |
|||
просто уберите
0 |
Vega251 413 / 100 / 3 Регистрация: 07.09.2011 Сообщений: 532 Записей в блоге: 2 |
||||
18.05.2012, 20:29 |
8 |
|||
Сообщение было отмечено как решение РешениеНу что за изврат? Вот как гораздо проще поступить без всяких там исключений:
9 |
5 / 5 / 1 Регистрация: 14.03.2011 Сообщений: 55 |
|
28.08.2012, 15:33 |
9 |
а как сделать , чтобы «.» точку можно было вводить ??
0 |
Kazbek17 1457 / 916 / 449 Регистрация: 06.02.2012 Сообщений: 2,812 |
||||
28.08.2012, 15:58 |
10 |
|||
Ну это не самый хороший способ!!!
2 |
49 / 31 / 2 Регистрация: 14.02.2013 Сообщений: 677 |
|
21.06.2013, 20:17 |
11 |
А можно ли сделать так, что бы во всей форме (допустим, там десять полей) нельзя было вводить буквы? Т.е. что бы не создавать десять раз событие для каждого текстбокса, что бы в каждый одно и тоже прописать, а один раз где-то указать, что в этой форме, или в TabControl, или TableLayoutPanel допустимы только числовые значения. Можно?
0 |
0 / 0 / 0 Регистрация: 09.03.2013 Сообщений: 18 |
|
24.07.2013, 23:51 |
12 |
Пишешь обработчик для textBox1.KeyPressed, а потом в свойствах остальных текстбоксов выбираешь его.
0 |
JustBear 7 / 7 / 0 Регистрация: 01.03.2013 Сообщений: 166 |
||||
25.07.2013, 11:27 |
13 |
|||
Как вариант — вызывать код ниже, например, вот так textBox1_KeyPress(); и Все.
3 |
49 / 31 / 2 Регистрация: 14.02.2013 Сообщений: 677 |
|
25.07.2013, 12:04 |
14 |
Darty,
0 |
Uurh 5 / 5 / 0 Регистрация: 06.06.2014 Сообщений: 94 |
||||
07.10.2014, 22:48 |
15 |
|||
Вот самый короткий и простой способ, лучше не найдешь)
2 |
mvs87 15 / 15 / 7 Регистрация: 21.08.2013 Сообщений: 115 |
||||
30.03.2015, 11:49 |
16 |
|||
Цифры + запятая + работающий BackSpace
9 |
1 / 1 / 2 Регистрация: 22.12.2014 Сообщений: 159 |
|
21.05.2015, 18:50 |
17 |
Присоединюсь с вопросом, а как запретить ввод русских символов(букв) ?
0 |
kolorotur 17366 / 12773 / 3343 Регистрация: 17.09.2011 Сообщений: 21,059 |
||||
21.05.2015, 19:13 |
18 |
|||
Сообщение было отмечено tezaurismosis как решение Решение
а как запретить ввод русских символов(букв) ? Обработка события KeyPress:
2 |
BorisMar84 16 / 16 / 6 Регистрация: 01.03.2014 Сообщений: 122 |
||||
23.08.2015, 01:35 |
19 |
|||
Доброго времени суток! К вопросу «Как для всех текстбоксов формы запретить ввод букв или цифр?» Проще всего сделать несколько классов потомков класса TextBox со своими ограничениями и потом использовать их во всех формах проекта. Для текстбокса в котором только цифры: новый класс ClsDigitTextBox, в нем обработчик.
Таким образом программируем на основе паттерна: все что связано с объектом программмируется в самом объекте. В форме остается код взаимодействия между объектами.
0 |
corbis 547 / 274 / 50 Регистрация: 03.04.2015 Сообщений: 926 |
||||
26.08.2015, 18:38 |
20 |
|||
А можно при помощи регулярных выражений определить любой вариант.
0 |
- Remove From My Forums
-
Вопрос
-
На поле textbox1, можно вводит слова и цифры, мне нужно чтобы можно было вводить только цифры.
Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.
Ответы
-
Я всё таки настоятельно рекомендую использовать в WinForms компонент NumericUpDown, если нужно вводить только числа.
В этом стандартном компоненте будет работать и клавиша Backspace, и вырезание/копирование/вставка. Эти возможности привычны пользователям и востребованы.
В предложенной кусочке кода таких возможностей не предусмотрено. Конечно, это можно реализовать, но зачем, если уже есть готовый компонент?
К тому же, в предложенном коде всё равно можно вставить текст в TextBox — мышкой через контекстное меню.
-
Помечено в качестве ответа
31 мая 2012 г. 14:09
-
Помечено в качестве ответа
-
Я тоже пишу на VB, поэтому могу только подсказать что
здесь можно перевести VB из той статья на C#Там если вы внимательно прочли делается целая комбинация действий — ввод разрешен так, что бы получилось положительное цело или дробное число с ограничением до сотой доли. Если вам не нужна такая кодировка то за старт можете взять более простой код и доращивать
его до ваших нуждPrivate Sub TextBox1_KeyPress(sender As System.Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress Dim c As Char = e.KeyChar If Not Char.IsNumber(c) Then e.Handled = True End If End Sub
он разрешит вводить только цифры, но при это можно будет ввести например 00000
Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!
-
Помечено в качестве ответа
Doctor Gordon
27 мая 2012 г. 14:32
-
Помечено в качестве ответа
I’m making a C# typing program
and I want the user to be unable to type anything when he types a wrong letter,
(I want the typing cursor to freeze at its position)
and when he presses backspace, only then he could resume his typing.
I have done this program in C++ by manipulating the ConsoleScreenCursorCoordinates,
I tried to do the same in C# via manipulating textBox.Location but it didn’t work.
In my program, there are 2 textBoxes, the sourceTextBox and the TypingTextBox
there is also a string variable called ‘text’ which will read from a textFile
via a StreamReader and then I use this text variable to compare each element from it with what the user is typing.
I tired this:
bool madeMistake = false;
Point CurrentTypingPosition;
string whatIsWrittenBeforeTheMistake = "";
private void TypingTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
try
{
if (!madeMistake)
{
if (e.KeyChar == text[typingIndex])
{
typingIndex++;
}
else if (e.KeyChar == backspace)
{
typingIndex--;
}
else
{
CurrentTypingPosition = TypingTextBox.Location;
madeMistake = true;
TypingTextBox.Text += " ";
TypingTextBox.Location = CurrentTypingPosition;
whatIsWrittenBeforeTheMistake = TypingTextBox.Text;
}
}
else
{
if (e.KeyChar == backspace)
madeMistake = false;
else
{
TypingTextBox.Text = whatIsWrittenBeforeTheMistake;
TypingTextBox.Location = CurrentTypingPosition;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
asked Jul 16, 2012 at 17:33
Another variation on this is to use the Handled
property of the KeyPress
event args, so you get something like:
void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (Char.IsControl(e.KeyChar))
{
e.Handled = false;
return;
}
char expectedNext = expected[textBox1.SelectionStart];
if (expectedNext != e.KeyChar)
{
e.Handled = true;
Console.WriteLine("Incorrect input");
}
}
answered Jul 16, 2012 at 17:52
David HallDavid Hall
32.6k10 gold badges90 silver badges127 bronze badges
1
Another, more robust way around this is to create a custom TextBox, inheriting from TextBox itself. You will then be able to handle the KeyDown (PreviewKeyDown) events etc, and determine at each key stroke if something is wrong. If invalid, you can set the KeyEventArgs (e.Handled) to true, and prevent further user input (apart from backspace, which you can check for).
This avoids having to hook into Textbox events, which is desirable if using MVVM. And you can use this method if you require very fine grained control.
answered Jul 16, 2012 at 17:47
stevethethreadstevethethread
2,5242 gold badges30 silver badges29 bronze badges
Would this work for you?
private void TypingTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
...
if (madeMistake)
TypingTextBox.ReadOnly = true;
...
}
answered Jul 16, 2012 at 17:39
1
You will have to tweak this to use your StreamReader object in place of the character array I am using here, but this will work, but without requiring them to have to backspace.
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
char[] charArr = { 'a', 'b', 'c' }; //spec out what is acceptable here
foreach (char c in charArr)
{
if (e.KeyChar.CompareTo(c) > 0)
{
e.Handled = true;
}
else
{
e.Handled = false;
}
}
}
answered Jul 16, 2012 at 18:12
GrayFox374GrayFox374
1,7429 silver badges13 bronze badges
Всем привет! Сегодня я покажу один из вариантов того, как можно реализовать запрет на ввод информации.
Думаю многие из вас сталкивались с тем что в программах невозможен ввод в поле имени, часть символов состоящих из цифры, Такое встречается только в играх, но в реальности то мы знаем, что такого быть не должно. А само имя или фамилия должно исключительно состоять только из букв.
В примере ниже рассмотрим запрет ввода цифр в текстбокс и запретим пользователю ввод прописных букв. Пример очень простой и занимает всего пару строк кода.
private void txt_PreviewTextInput(object sender, TextCompositionEventArgs e) { if (int.TryParse(e.Text, out int i)) { e.Handled = true; } if (e.Text==e.Text.ToLower()) { e.Handled = true; } } |
Как видим из кода у нас имеется TextBox с именем txt, у которого имеется событие PreviewTextInput. Внутри этого события, используем условии на проверку, введенный пользователем символ приводим к целочисленному типу, если это число то событие завершается, а символ не печатается в TextBox. Во втором условии, происходит проверка символа, в сравнении с нижним регистром этого же символа, если они равны, это будет означать, что пользователь ввел символ в нижнем регистре.
Следующий пример более сложный но более верный, так как он пропускает ввод запятой при чем одной и она не должна быть первой, и не встречаться в середине числа не сколько раз, да бы мы могли полученное число привести к вещественному типу. Для этого нам необходимо подписаться на события TextBox KeyPress и TextChanged
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
private void txt_KeyPress(object sender, KeyPressEventArgs e) { if (Char.IsNumber(e.KeyChar) | (e.KeyChar == Convert.ToChar(«,»)) | e.KeyChar == ‘\b’) { TextBox str = (TextBox)sender; int count = 0; if (str.Text.Length > 0) { for (int i = 0; i < str.Text.Length; i++) if (str.Text[i].ToString() == «,») count++; if (count > 0 ) str.Clear(); } return; } else e.Handled = true; } private void txt_TextChanged(object sender, EventArgs e) { TextBox textBox = (TextBox)sender; if (textBox.Text.StartsWith(«,»)) textBox.Text = textBox.Text.Substring(1); } |
Таким образом мы рассмотрели два варианта из множества, как можно сделать контроль ввода пользователем в текстовое поле, и фильтровать ввод.