Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/344: Рейтинг темы: голосов - 344, средняя оценка - 4.86
 Аватар для valent11
8 / 8 / 3
Регистрация: 30.11.2011
Сообщений: 64

Ввод только цифр в TextBox

15.04.2012, 12:05. Показов 64071. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Взялся писать курсовой на WPF , поидее поспешил)
Вообщем ,вот такая проблема возникла.
На Виндовс форм делал так

C#
1
2
3
4
if (!(Char.IsDigit(e.KeyChar)) && !((e.KeyChar == ',') && (textBox1.Text.IndexOf(",") == -1) &&(textBox1.Text.Length != 0)))
            {
                if (e.KeyChar != (char)Keys.Back) e.Handled = true;
            }
Но в WPF нету Keypressa.
Нашел на этом форуме подсказку которая тоже не работает,возможна работает но я из за своей зелености не догяняю, Подсказка в том что бы использовать KeyDown:

C#
1
2
3
4
5
6
 private void textBoxBase_KeyDown(object sender, KeyEventArgs e)
        {
            if (!(Char.IsDigit(e.KeyChar)) && !((e.KeyChar == ',') && (textBoxBase.Text.IndexOf(",") == -1) &&(textBoxBase.Text.Length != 0)))
            {
                if (e.KeyChar != (char)Keys.Back) e.Handled = true;
        }
Но компиль ругается---

Ошибка 2 "System.Windows.Input.KeyEventArgs" не содержит определения для "KeyChar" и не был найден метод расширения "KeyChar", принимающий тип "System.Windows.Input.KeyEventArgs" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку) E:\УНИВЕР\Семестр3.2\КУРСОВОЙ 3 курс\Курсовой\Курсовой\MainWindow.xaml.c s 65 34 Курсовой
Подскажите как выйти с это1 глупой ситуации.
Спс за Ваше внимание.
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.04.2012, 12:05
Ответы с готовыми решениями:

TextBox. Ввод только цифр от 16 до 100
задача: ввод только цифр от 16 до 100 как можно регулярным выражением сделать от 16-100 так не работает! или может еще какой способ...

Ввод в Textbox только цифр и запятую
Всем привет. Не давно начал изучать WPF и столкнулся с проблемой. Мне нужно, чтобы в textbox вводились только цифры и один раз запятая. В...

Ввод только цифр в textbox(MVVM)
Как сделать ввод только цифр в textbox, не нарушая архитектуру MVVM?

15
Peace 2 all shining faces
 Аватар для Vorona
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
15.04.2012, 19:34
посмотрите этот пример или скачайте его исходник, там отлично расписано, как создать свою проверку валидации
и от себя добавлю функцию, которая будет проверять или данные прошли валидацию
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System.Windows;
using System.Windows.Controls;
 
class Validator
{
    public static bool HasErrors(DependencyObject obj)
    {
        foreach (object child in LogicalTreeHelper.GetChildren(obj))
        {
            TextBox element = child as TextBox;
            if (element == null) continue;
            if (Validation.GetHasError(element) || (element.Text.Length == 0))
            {
                return true;
            }
            HasErrors(element);
        }
        return false;
    }
}
и для при мера, при попытке нажатия кнопки, вы просто проверяете в обработчике события Click условие
C#
1
2
3
4
5
6
7
8
9
10
11
private void cmdSomeButton_Click(object sender, RoutedEventArgs e)
{
    //обновляем значение в TextBox'e чтобы сразу же увидеть 
    //или была соверешена ошибка в текстовом поле или нет
    txtSomeTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
    
    if (!Validator.HasErrors(grdSomeGrid))
    {
        /* ... */
    }
}
з.ы. функция принимает объект типа DependecyObject, т.е. вы можете передавать в функцию любой контейнер компоновки, к примеру, и она возвратит true, если хотя бы в одном элементе TextBox из этого контейнера, данные не прошли валидацию

конечно, свиду может показаться немного громоздким, но уделив немного времени изучению этой технологии, можно без труда динамически проводить любую валидацию используя регулярные выражения, привязки данных, а так же задание любого шаблона и поведения при сообщении об ошибке
3
 Аватар для valent11
8 / 8 / 3
Регистрация: 30.11.2011
Сообщений: 64
16.04.2012, 17:28  [ТС]
if (!Validator.HasErrors(grdSomeGrid))
что значит grdSomeGrid? так как у меня на его ругается
0
Peace 2 all shining faces
 Аватар для Vorona
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
16.04.2012, 17:56
grdSomeGrid - просто имя какого-то контейнера компоновки, к примеру Grid, в котором находятся TextBox'ы, которые мы проверяем на валидацию
XML
1
2
3
<Grid x:Name="grdSomeGrid">
    <!-- ... -->
</Grid>
txtSomeTextBox.GetBindingExpression(Text Box.TextProperty).UpdateSource();
аналогично и txtSomeTextBox - имя TextBox'а, который нужно обновить, в случае, если мы вообще не притрагивались к полю ввода
private void cmdSomeButton_Click(object sender, RoutedEventArgs e)
и cmdSomeButton это имя кнопки, при нажатии на которую (cmdSomeButton_Click), обрабатываются данные из наших TextBox'ов
1
 Аватар для valent11
8 / 8 / 3
Регистрация: 30.11.2011
Сообщений: 64
16.04.2012, 20:35  [ТС]
все остальное я понял)))просто думал ,что не нужно править xaml

Добавлено через 1 час 21 минуту
Вот что нашел, может кому пригодиться ---

C#
1
2
3
4
5
6
7
8
9
10
  public Window()
        {
            InitializeComponent();
            this.textBox.PreviewTextInput += new TextCompositionEventHandler(textBox_PreviewTextInput);
        }
 
        void textBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            if (!Char.IsDigit(e.Text,0)) e.Handled = true;
        }
3
 Аватар для valent11
8 / 8 / 3
Регистрация: 30.11.2011
Сообщений: 64
19.04.2012, 01:06  [ТС]
подскажите пжл как сделать с предыдущим кодом ,так что бы можно было ввести одну только одну цифру, и что б эта цифра была 1 или 2 или 3 ?
0
Peace 2 all shining faces
 Аватар для Vorona
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
19.04.2012, 04:09
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private string _inputValue = "3";
 
public Window()
{
    InitializeComponent();
    this.textBox.PreviewTextInput += new TextCompositionEventHandler(textBox_PreviewTextInput);
}
 
void textBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
    if (!Char.IsDigit(e.Text, 0) || (sender as TextBox).Text.Length >= _inputValue.Length || e.Text != _inputValue)
        e.Handled = true;
}
1
 Аватар для valent11
8 / 8 / 3
Регистрация: 30.11.2011
Сообщений: 64
20.04.2012, 00:05  [ТС]
а если не тяжело, можно все дословно откомментировать, просто не хотелось бы просто копировать и вставлять. Хочется разобраться ))

Добавлено через 46 минут
код работает но не полностью....вводиться только цифра 3 , а нужно что бы можно было ввести 1 или 2 или 3 .
0
Peace 2 all shining faces
 Аватар для Vorona
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
20.04.2012, 07:11
правда, вместо того чтобы грубо проверять в операторе if или введенный символ соответствует 1 или 2 или 3, лучше создать собственное правило с помощью регулярного выражения, так как если ваш диапазон допустимых символов увеличится, вам не придется нагромождать оператор if, а просто внесете коррективы в регулярное выражение
C#
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
27
public Window()
{
    //инициализация всех компонентов окна в его конструкторе
    InitializeComponent();
    //подписываем textBox на событие PreviewTextInput, 
    //с помощью которого можно обрабатывать вводимый текст
    textBox.PreviewTextInput += new TextCompositionEventHandler(textBox_PreviewTextInput);
}
 
//создаем регулярное выражение, описывающее правило ввода
//в данном случае, это символы от 1 до 3
Regex inputRegex = new Regex(@"^[1-3]$");
 
//собственно сам обработчик события PreviewTextInput для элемента textBox
void textBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
    //проверяем или подходит введенный символ нашему правилу
    Match match = inputRegex.Match(e.Text);
    //и проверяем или выполняется условие
    //если количество символов в строке больше или равно одному либо
    //если введенный символ не подходит нашему правилу
    if ((sender as TextBox).Text.Length >= 1 || !match.Success) 
    {
        //то обработка события прекращается и ввода неправильного символа не происходит
        e.Handled = true; 
    }
}
ах да, для регулярных выражений нужно подключить пространство имен, потому добавте еще один using в начале файла
C#
1
using System.Text.RegularExpressions;
3
 Аватар для valent11
8 / 8 / 3
Регистрация: 30.11.2011
Сообщений: 64
02.05.2012, 23:27  [ТС]
Возник еще 1 вопрос ....Как мне сделать так что бы вводить к примеру число 100 ? с помощью регулярных выражений
0
Peace 2 all shining faces
 Аватар для Vorona
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
03.05.2012, 03:36
C#
1
Regex inputRegex = new Regex(@"^100$");
но тогда вам нужно будет в условии изменить
C#
1
if ((sender as TextBox).Text.Length >= 3 || !match.Success)
или просто так
C#
1
Regex inputRegex = new Regex(@"^100{3}$");
C#
1
if (!match.Success)
0
1 / 1 / 1
Регистрация: 04.12.2013
Сообщений: 17
20.04.2016, 00:38
как можно регулярным выражением сделать от 16-100

Regex inputRegex = new Regex(@"^[16-100]$"); так не работает! или может еще какой способ есть?
1
0 / 0 / 1
Регистрация: 15.02.2014
Сообщений: 9
18.09.2016, 13:29
может кому нибудь пригодится
C#
1
2
3
4
5
6
7
private void timer_txtbx_KeyDown(object sender, KeyEventArgs e)
        {
            if (!((e.Key.GetHashCode() >= 34) && (e.Key.GetHashCode() <= 43)) && !((e.Key.GetHashCode() >= 74) && (e.Key.GetHashCode() <= 83))) 
            {
                e.Handled = true;
            }
        }
Работает аналогично как
C#
1
2
3
4
5
6
7
private void timer_txtbx_KeyDown(object sender, KeyEventArgs e)
        {
            if (!(((int)e.Key >= 34) && ((int)e.Key <= 43)) && !(((int)e.Key >= 74) && ((int)e.Key <= 83))) 
            {
                e.Handled = true;
            }
        }
Но надо отлавливать пробел ибо он почему то не считается клавишей и события при его нажимании не возникает .
0
2 / 2 / 0
Регистрация: 01.04.2018
Сообщений: 11
09.10.2018, 22:26
Короче, ребят, я тут посидел и придумал очень легкий и запоминающийся код, который очень подойдет для WPF. В общем, смотрите.
Вводятся только русские буковки, точка и запятая.


C#
1
2
3
4
5
6
7
8
9
private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            string inputSymbol = e.Text.ToString();
 
            if(!Regex.Match(inputSymbol, @"[а-яА-Я]|\.|,").Success)
            {
                e.Handled = true;
            }
        }
Если вы хотите сделать проверку по ANSI-коду то есть такой способ.
В данном примере вводятся только "ABC"(Латинские) и точка.


C#
1
2
3
4
5
6
7
8
9
private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            char inputSymbol = e.Text[0];
 
            if (inputSymbol != 65 && inputSymbol != 66 && inputSymbol != 67 && inputSymbol != 46)
            {
                e.Handled = true;
            }
        }
Всем удачного времени суток!)
2
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
10.10.2018, 07:38
Цитата Сообщение от White_Tomato Посмотреть сообщение
Короче, ребят, я тут посидел и придумал очень легкий и запоминающийся код, который очень подойдет для WPF. В общем, смотрите.
ага, только под MVVM он как бы не подойдет
0
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
10.10.2018, 13:30
Цитата Сообщение от Почтальон Посмотреть сообщение
ага, только под MVVM он как бы не подойдет
Данную логику можно засунуть в Behavior и применить к контролу. Для большей настравиваимости можно regex и inputSymbol задавать у Behavior в качестве свойств. Если сделать так, то MVVM не пострадает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.10.2018, 13:30
Помогаю со студенческими работами здесь

Реализовать ввод в textbox только цифр
Привет всем! Хочу сделать ввод в textbox только цифр. Примеров масса, но в проекте WPF у textbox'a нету события keypress. Еще, в...

Как сделать ввод в TextBox только цифр?
Есть TextBox, куда нужно разрешить вводить только числа (дробные и отрицательные тоже разрешить). Искал решения в интернете, нашел лишь с...

Сделать доступным только ввод цифр и знака "-" в поле TextBox
Ну собственно вопрос в названии темы: Как разрешить только ввод цифр и знака &quot;-&quot; в поле TextBox? Знаю как сделать ввод...

Ввод в TextBox только чисел и не более одной точки
Требуется ввод чисел 0-9 и только одной точки в TextBox с клавиатуры. При этом нельзя использовать эвенты, а писать лишь используя View и...

Организовать ввод в TextBox только русских букв, и максимум 3 пробела
Как реализовать ввод в textbox только русских букв и максимум 3 пробела?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru