Как запретить ввод в textbox в windows forms

Пытаюсь создать калькулятор на Windows Forms, С#. Добавил кнопки для ввода чисел и следовательно требуется ограничить ввод пользователя в TextBox.
Рассматриваю 2 варианта:

  • Полностью ограничить ввод пользователя с клавиатуры.
  • Ограничить ввод только для символов и букв.

НО, хоть сколько я буду рассматривать я не знаю как реализовать ни то, ни это. Прошу помочь.

задан 17 ноя 2017 в 21:22

raspberry's user avatar

4

Используй свойство TextBox.ReadOnly:

TextBox.ReadOnly = true;

ответ дан 17 ноя 2017 в 21:45

Volodymyr Rets's user avatar

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

gogo's user avatar

Yekaterin@

1 / 1 / 0

Регистрация: 22.11.2010

Сообщений: 27

1

18.05.2012, 19:10. Показов 149260. Ответов 60

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Как запретить ввод букв в textBox? Вот эта конструкция неверно работает

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
 public void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            try 
            {
            char s = Convert.ToChar(textBox1.Text);
            if ((s <= '0') || (s >= '9'))
                MessageBox.Show("Вы ввели символ! Пожалуйста,введите цифру");
              }
                catch(System.FormatException)
            {
                MessageBox.Show("Вы ввели символ! Пожалуйста,введите цифрy");
                }
        }



1



emdroof

6 / 6 / 0

Регистрация: 11.04.2011

Сообщений: 88

18.05.2012, 19:34

2

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
 private void textBox1_TextChanged(object sender, EventArgs e)
        {
            try
            {
                int s = Convert.ToInt32(textBox1.Text);
            }
            catch (System.FormatException)
            {
                MessageBox.Show("Вы ввели символ! Пожалуйста,введите цифрy");              
            }    
            textBox1.Clear();
    
        }

количество введенных символов будет зависеть от типа 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



aleksnice

Заблокирован

18.05.2012, 20:18

6

А как ты исправила? а то у меня такая же фигня щас, не дает ввести цифры(



0



Yekaterin@

1 / 1 / 0

Регистрация: 22.11.2010

Сообщений: 27

18.05.2012, 20:27

 [ТС]

7

просто уберите

C#
1
textBox1.Clear();



0



Vega251

413 / 100 / 3

Регистрация: 07.09.2011

Сообщений: 532

Записей в блоге: 2

18.05.2012, 20:29

8

Лучший ответ Сообщение было отмечено как решение

Решение

Ну что за изврат? Вот как гораздо проще поступить без всяких там исключений:

C#
1
2
3
4
5
6
7
void TextBox1KeyPress(object sender, KeyPressEventArgs e)
        {
            
            if (Char.IsDigit (e.KeyChar)) return;
            else
            e.Handled=true;
        }



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

C#
1
2
3
4
5
6
        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
          if(Char.IsNumber(e.KeyChar) | (Char.IsPunctuation(e.KeyChar)))return;
          else
          e.Handled=true;
        }

Ну это не самый хороший способ!!!



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(); и Все.

C#
1
2
3
4
5
6
7
8
9
  private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            char ch = e.KeyChar; 
 
            if (!Char.IsDigit(ch) && ch != 8) //Если символ, введенный с клавы - не цифра (IsDigit),
            {
                e.Handled = true;// то событие не обрабатывается. ch!=8 (8 - это Backspace)
            }
        }



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

C#
1
2
3
4
5
private void IsDigit_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && e.KeyChar != 8)
                e.Handled = true;
        }

Вот самый короткий и простой способ, лучше не найдешь)



2



mvs87

15 / 15 / 7

Регистрация: 21.08.2013

Сообщений: 115

30.03.2015, 11:49

16

Цифры + запятая + работающий BackSpace

C#
1
2
3
4
5
6
        private void TB_rez_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsNumber(e.KeyChar) | (e.KeyChar == Convert.ToChar(",")) | e.KeyChar == '\b') return;
            else
                e.Handled = true;
        }



9



1 / 1 / 2

Регистрация: 22.12.2014

Сообщений: 159

21.05.2015, 18:50

17

Присоединюсь с вопросом, а как запретить ввод русских символов(букв) ?



0



kolorotur

Эксперт .NET

17366 / 12773 / 3343

Регистрация: 17.09.2011

Сообщений: 21,059

21.05.2015, 19:13

18

Лучший ответ Сообщение было отмечено tezaurismosis как решение

Решение

Цитата
Сообщение от eastsida
Посмотреть сообщение

а как запретить ввод русских символов(букв) ?

Обработка события KeyPress:

C#
1
2
char c = e.KeyChar;
e.Handled = c >= 'а' && c <= 'я' || c >= 'А' && c <= 'Я' || c == 'ё' || c == 'Ё';



2



BorisMar84

16 / 16 / 6

Регистрация: 01.03.2014

Сообщений: 122

23.08.2015, 01:35

19

Доброго времени суток! К вопросу «Как для всех текстбоксов формы запретить ввод букв или цифр?» Проще всего сделать несколько классов потомков класса TextBox со своими ограничениями и потом использовать их во всех формах проекта.

Для текстбокса в котором только цифры: новый класс ClsDigitTextBox, в нем обработчик.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    public class ClsNumericTextBox : TextBox
    {
        private string lastText;
        private double value;
 
 
        public ClsNumericTextBox()
            : base()
        {
            lastText = "0";
            this.Text = "0";
            this.TextAlign = HorizontalAlignment.Right;
            this.TextChanged += new EventHandler(ClsNumericTextBox_TextChanged);
        }
 
        
        void ClsNumericTextBox_TextChanged(object sender, EventArgs e)
        {
            if (!double.TryParse(this.Text, out value)) this.Text = lastText;
            else lastText = this.Text;
        }
     }

Таким образом программируем на основе паттерна: все что связано с объектом программмируется в самом объекте. В форме остается код взаимодействия между объектами.



0



corbis

547 / 274 / 50

Регистрация: 03.04.2015

Сообщений: 926

26.08.2015, 18:38

20

А можно при помощи регулярных выражений определить любой вариант.
Например, ввод только цифр:

C#
1
2
3
4
5
6
7
using System.Text.RegularExpressions;
 
        Regex rx = new Regex(@"\D", RegexOptions.IgnoreCase);
        private void TextBox1_TextChanged(object sender, TextChangedEventArgs e)
        {
            TextBox1.Text = rx.Replace(TextBox1.Text, "");
        }



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

vexe's user avatar

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 Hall's user avatar

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

stevethethread's user avatar

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

500 - Internal Server Error's user avatar

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

GrayFox374's user avatar

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);

        }

Таким образом мы рассмотрели два варианта из множества, как можно сделать контроль ввода пользователем в текстовое поле, и фильтровать ввод. 

  • Как запретить автоматическую установку драйверов в windows 10
  • Как заполучить права администратора windows
  • Как запретить windows 10 перезагрузку после обновлений
  • Как запретить exe файлу доступ в интернет windows 10
  • Как запретить coreldraw доступ в интернет windows 10