Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > textbox с вводом только чисел


Автор: allx86 19.5.2007, 01:21
Наверняка каждому однажды приходилось решать проблему ввода чисел в textbox 
(чтобы могли вводиться только числа и разделитель - наподобие textbox стандартного калькулятора windows). 
Хотелось бы посмотреть и сравнить различные решения на С#. Кто как делает?




Автор: Mymik 19.5.2007, 08:41
allx86, а можно узнать это где ???
Допустим в asp.net это делается с помощью JS
Код

function checkInput(event){
    if(((event.charCode > 57) || (event.charCode < 47)) && (event.keyCode == 0) && (!event.ctrlKey)){return!1;}
}

А если в виндоус, то там же есть событие по которому текст еще не попал в форму, но в этом событии ты можешь получить текст. Там вот и фильтруй это дело.

Если ты хочешь чтобы текст мог вводится, но при этом программа не пропускала его. То используй Regex. ставишь на поля валидатор и пока пользователь не введет текст соответствующий шаблону, программа дальше не станет работать.

Автор: Mymik 19.5.2007, 09:56
да. А в Windows вот решение -->> http://forum.vingrad.ru/forum/topic-151989.html

Автор: allx86 19.5.2007, 13:55
Цитата

allx86, а можно узнать это где ???

ИМХО, на каждый текстбокс должны быть наложены ограничения на вводимые значения, в соответствии с логикой программы.
Это один из примеров ограничений.

Цитата

да. А в Windows вот решение -->> http://forum.vingrad.ru/forum/topic-151989.html
 

Немного не то. Там не вводится DecimalSeparator


Хорошо, поставлю вопрос по-другому:

Как реализовать функциональность textbox стандартного калькулятора Windows на С#.

Автор: Сарт 19.5.2007, 14:59
Надеюсь это тебя устроит:

Для запрещения ввода в textbox любых даннных кроме цифр мы должны в обработчике KeyPress для textbox'а присвоить свойству Handled передаваемого параметра типа System.Windows.Forms.KeyPressEventArgs значение true.

Вот пример кода:

     
Код

   private void textBox1_KeyPress(object sender,
System.Windows.Forms.KeyPressEventArgs e)
        {
            // Если это не цифра.
            if(!Char.IsDigit(e.KeyChar))
            {
                // Запрет на ввод более одной десятичной точки.
                if(e.KeyChar != '.' || textBox1.Text.IndexOf(".") != -1)
                {
                    e.Handled = true;
                }
            }
        }
Строка

...
Код

if(e.KeyChar != '.' || textBox1.Text.IndexOf(".") != -1)
...


тут нужна для того, чтобы разрешить ввод десятичного разделителя (точки в данном случае) - причем только одного: если десятичный разделитель уже существует, то вводить второй заперщено.

Автор: Mymik 19.5.2007, 15:53
Цитата(allx86 @  19.5.2007,  13:55 Найти цитируемый пост)
ИМХО, на каждый текстбокс должны быть наложены ограничения на вводимые значения, в соответствии с логикой программы.
Это один из примеров ограничений.

я имел ввиду в какой отрасли программирования ты это используешь ??? типа Windows, или asp.net ??? потому что в этих двух отраслях по разному реализуется данный функционал.
Цитата(allx86 @  19.5.2007,  13:55 Найти цитируемый пост)
Немного не то. Там не вводится DecimalSeparator

Не хочу показаться грубым. Но разве мы обязаны за тебя писать код ??? вообще-то тебе дали яркий пример как это реализовываться. А дописать пару строк кода самому...  smile 

Автор: allx86 19.5.2007, 15:59
Цитата

я имел ввиду в какой отрасли программирования ты это используешь ???

Windows.Forms

Цитата

Не хочу показаться грубым. Но разве мы обязаны за тебя писать код ???


Никто никому ничего не обязан. Если не хочется отвечать, то никто не заставляет.

Разумеется, я могу и сам написать, но на  это уйдет время, которое я могу потратить на решение функциональных задач, а не на  техническую задачу, которая уже неоднократно решена.  И заново изобрести колесо. 




Автор: Сарт 20.5.2007, 03:02
А ты хочешь сразу космолет построить?+ тот код что я кинул- это само колесо. Тебе осталось его только суметь прикрутить.

Автор: archeg 20.5.2007, 10:27
Цитата(allx86 @  19.5.2007,  15:59 Найти цитируемый пост)
Разумеется, я могу и сам написать, но на  это уйдет время, которое я могу потратить на решение функциональных задач, а не на  техническую задачу, которая уже неоднократно решена.  И заново изобрести колесо. 

Несмотря на идею многоразового использования кода такое бывает. Кто-то придумал колесо. Потом его придумал ты. И несмотря на то, что ты придумал тоже самое колесо, у тебя оно имеет четыре спицы - у него три. И неизвестно, какое колесо выйдет прочнее.......

Автор: allx86 20.5.2007, 12:22
Цитата

Несмотря на идею многоразового использования кода такое бывает. Кто-то придумал колесо. Потом его придумал ты. И несмотря на то, что ты придумал тоже самое колесо, у тебя оно имеет четыре спицы - у него три. И неизвестно, какое колесо выйдет прочнее.......


В том то и дело, что хотелось бы сравнить различные варианты, кто как делает. Выбрать из каждого метода те моменты, которые понравились и изобрести уже собственное "колесо", возможно уже и с пятью спицами.

Цитата

А ты хочешь сразу космолет построить?+ тот код что я кинул- это само колесо. Тебе осталось его только суметь прикрутить.


И вот уже это полученное колесо "прикручивать".

Автор: SherbAnt 20.5.2007, 16:37
Я использовал http://www.gotdotnet.ru/Downloads/Examples/279046.aspx


А насчет того чтобы не изобретать велосипед -> всё правильно.


Цитата(mr.DUDA @  28.10.2006,  11:44 Найти цитируемый пост)
CodeProject - куча бесплатных примеров на .NET, туториалов и контролов.

www.codeproject.net

Автор: Azzdorf 23.5.2007, 13:43
тут про MasketTextBox есть инфо http://www.rsdn.ru/article/dotnet/WinForms20.xml#EMIAE

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)