#c# #winforms
#c# #winforms
Вопрос:
В настоящее время я работаю над пользовательским элементом управления, который позволяет пользователям вводить либо десятичную дробь, либо формат времени (чч: мм). Поэтому я хотел бы, чтобы, если TextBox
содержит точку (.), пользователь больше не добавлял / вводил двоеточие (:) и наоборот.
У меня есть этот код ниже, чтобы пользователь мог вводить только цифру, точку и двоеточие.
private void txtTime_KeyPress(object sender, KeyPressEventArgs e)
{
if ((!char.IsControl(e.KeyChar) amp; !char.IsDigit(e.KeyChar) amp; !(Convert.ToString(e.KeyChar) == ".") amp; !(Convert.ToString(e.KeyChar) == ":")))
{
e.Handled = true;
}
else
{
//only allow one '.' amp; ':'
if (e.KeyChar == '.' amp;amp; (sender as TextBox).Text.IndexOf('.') > -1)
{
e.Handled = true;
}
else if (e.KeyChar == ':' amp;amp; (sender as TextBox).Text.IndexOf(':') > -1)
{
e.Handled = true;
}
}
}
Итак, мой вопрос в том, как я это сделаю?
Кто-нибудь может мне помочь? Заранее спасибо.
Комментарии:
1. Итак, в чем ваш вопрос? Работает ли ваш код?
2. Что, если они вставят в ваш элемент управления?…
3. Обработайте
Validated
событие и проверьте содержимое текстового поля.4. @vasily.sib вопрос в том, как я это сделаю, если текстовое поле содержит точку (.), текстовое поле не должно позволять пользователю вводить двоеточие (:) и наоборот.
5. Элементы управления, которые пытаются предотвратить «недопустимый» ввод в виде пользовательских типов, могут быть весьма проблематичными для некоторых пользователей. Обычно гораздо удобнее проверять отправку или, по крайней мере, ждать, пока фокус не будет потерян. Не думайте, что вы знаете намерения пользователей лучше, чем они сами, когда вводят текст.
Ответ №1:
Для операторов неприятно, если они что-то напечатали и хотят это исправить, но не могут, потому что в этом есть неправильная точка или точка с запятой.
Предположим, оператор попытался ввести 14:38:21
, но вместо этого вводит:
14.38
«О нет, это неправильно, я хотел 14.38:21! Итак, давайте сначала продолжим печатать :21
, а затем вернемся, чтобы заменить точку на двоеточие!»
Представьте разочарование оператора, когда он не может печатать :21
и не понимает, почему
В Windows forms проверка введенных входных данных выполняется только тогда, когда оператор сообщает, что закончил редактирование входных данных.
Поэтому используйте TextBox.OnValidating
. Когда вызывается этот символ, вы можете либо принять, либо отклонить ввод и сообщить оператору, что не так.
protected override void OnValidating (CancelEventArgs e)
{
e.Cancel = this.IsInputErrorDetected;
if (e.Cancel)
{
this.DisplayInputProblem();
}
}
Бонусный балл: также работает с копипастом.
Комментарии:
1. Спасибо за это. Я попробую использовать событие проверки текстового поля.
Ответ №2:
Я не уверен, правильно ли я понял ваш вопрос. Возможно, вы ищете, maskedTextBox
где вы можете указать маску пользовательского ввода.
У этого есть маска на короткое время ЧЧ: ММ
Комментарии:
1. Я знаю MaskedTextBox, но я ищу элемент управления, который позволяет пользователю вводить десятичное значение, например 1.5, затем при потере фокуса он будет форматироваться до времени, подобного 1: 30. Таким образом, если пользователь введет 1:30, он останется таким же, как 1: 30.
2. @Zhyke — а что, если пользователь вводит,
1.30
предполагая, что это будет интерпретировано как 1 час и 30 минут (или 1 минута и 30 секунд), и не замечает, что ваш элемент управления «услужливо» переосмысливает их ввод? Лучше всего использовать единый формат ввода или специальный элемент управления выбора..