2009-05-06 4 views
3

Эта, по-видимому, простая задача привела к некоторой головной боли. Я просто хочу, чтобы пользователь вводил любой текст, который преуспевает float.TryParse в текстовый элемент управления.C# Проверка ввода для текстового поля: поплавок

Я мог бы использовать обычный TextBox и проверять текст в каком-то btnOK_Click, но это, очевидно, хромает. Кроме того, есть хороший встроенный элемент управления MaskedTextBox, но я не смог установить его маску равным float.TryParse. Кроме того, кажется, что проверка действительна только тогда, когда происходит смена фокуса.

Выкапывание в сети принесло интересные идеи, но ни один из них не так хорош, как хотелось бы.

Как вы решили эту проблему? Я просто пропустил очевидное решение, или мне нужно реализовать эту функциональность самостоятельно?

Я знаю несколько подобных потоков на SO, но не было приемлемого решения, которое можно найти.

Обновление: Да, WinForms.

ответ

6

Редактировать

Ну, что делает его намного проще ... Просто добавьте Validating обработчик событий для вашего текстового поля и сделать TryParse в коде позади. Если он недействителен, предложите пользователю как таковой.

Validating будет срабатывать, когда пользователь заканчивает ввод и перемещает фокус из TextBox, так что если вам нужно сделать на проверке лета, вы могли бы справиться с TextChanged или на часть KeyPress/KeyUp обработчик событий вместо

Оригинал

Является ли это в asp.net или WinForms/WPF

Если его asp.net, вы можете использовать комбинацию RegularExpressionValidator (для учета запятой Разделения, 1 десятичной точки, и т.д. ...) и a RangeValidator для установки значений min/max f или поплавок.

Кроме того, единственный способ гарантировать, что это было бы обернуть текстовое поле в UpdatePanel, воткнуть CustomServerValidator на него, и в функции сервера валидации, сделать TryParse на значении TextBox.Text, если это удастся, IS ДЕЙСТВИТЕЛЬНО, если он не сработал, НЕ ДАЕТ

4

Будьте осторожны с использованием Validating и проверки на ложные. Вы можете обнаружить, что, если вы не вводите действительные данные, вы не можете перемещать фокус с текстового поля, что является действительно большой болью для удобства использования.

Я решаю это, просто попробовав TryParse() на LostFocus, и если TryParse не удается, я окрашиваю фон текстового поля красноватым оттенком, чтобы было очевидно, что что-то не так.

+1

В моем окончательном решении я кэширую последнее действительное значение и, при необходимости, сбрасываю текст, если фокус потерян. – mafu

+2

Ваша идея изменить цвет была приятной. В моем решении раскраска сразу по недопустимым значениям делает очевидным для пользователя, что он должен изменить значение. – mafu

+0

Я поместил TryParse() в TextChanged и установил backcolor текстового поля на красный, когда TryParse сработает и сбросит backcolor на Color.Empty, когда TryParse пройдет. Это дает мгновенную обратную связь, когда пользователь вводит данные. – CleanCoder

Смежные вопросы