Каков наилучший способ реализовать ограничения ввода для TextBox в C #? - PullRequest
7 голосов
/ 06 марта 2009

Каков наиболее элегантный способ ограничения ввода элемента управления TextBox (или чего-либо еще, что входит в стандартную поставку .NET 3.5) для чисел с плавающей запятой?

В настоящее время я выполняю всю тяжелую работу, наследуя от TextBox и переопределяя OnKeyPress. Однако я не могу не задаться вопросом, изобретаю ли я велосипед заново.

Ответы [ 7 ]

13 голосов
/ 06 марта 2009

Не забудьте о следующих проблемах / проблемах, с которыми вы столкнетесь, если пойдете по предложенному маршруту:

  • Пользователи могут использовать Ctrl - V или Shift - Вставить , чтобы вставить "недопустимые" значения в (второй является немного сложнее поймать) ... но пользователям, вероятно, следует разрешить вставлять допустимые значения в элемент управления
  • Пользователи могут щелкнуть правой кнопкой мыши, вставить недопустимые значения в контекстное меню по умолчанию
  • Даже если вы попытались устранить предыдущую проблему, предоставив текстовому полю собственное контекстное меню, пользователи могут щелкнуть правой кнопкой мыши за пределами вашего элемента управления, удерживая нажатой правую кнопку, перетащить текстовое поле и отпустить, чтобы получить доступ к контексту по умолчанию. -меню (и вставить в недопустимые значения)
  • Независимо от того, какую обработку клавиш вы выполняете, не следует отключать комбинации клавиш, такие как Alt - F4 и т. Д. (И да, вы сломаете это, если вы установите SuppressKeyPress для всего недопустимая цифра)
  • Пользователи, вероятно, должны иметь возможность вводить частичные значения (например, "-.", когда они начинают печатать "-.23") без того, чтобы ваше текстовое поле наказывало их
  • Такие номера, как "-.1e-2" могут считаться законными
  • Пользователь может реально ввести значение, которое содержит только цифры, но которое переполнит float
  • Худший из всех: Какой-то другой загадочный уголок, который ваши пользователи найдут после того, как вы отправили (!!)

Мораль? Это может быть очень сложно сделать то, что вы предлагаете.

Возможно, вы либо хотите выполнить комбинацию из следующего:

  • Используйте элемент управления, который знает кто-то, кто знает все угловые корпуса (например, Microsoft)
  • Провести базовую проверку в событии TextChanged (и сделать что-то пассивное, например, изменить цвет фона текстового поля)
  • Сохраняйте проверку до тех пор, пока вы на самом деле не попытаетесь использовать введенное значение
  • Используйте системные библиотеки для Parse значения пользователя для вас
2 голосов
/ 06 марта 2009

Взгляните на MaskedTextBox элемент управления. Он также наследуется от TextBoxBase и, вероятно, обладает функциональностью, которую вы встраиваете в свою.

1 голос
/ 06 марта 2009

А как насчет использования NumericUpDown?

0 голосов
/ 06 марта 2009

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

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

0 голосов
/ 06 марта 2009

Я обнаружил свойство ValidatingType для maskedTextBox:

maskedTextBox1.ValidatingType = typeof(System.Double);

Это действительно говорит вам, действительно ли это или нет. К сожалению, кажется, что он проверяется только при изменении фокуса (и даже тогда он фактически ничего не делает); но, возможно, есть какой-то способ использовать это.

0 голосов
/ 06 марта 2009

Или проверьте соответствие, используя

void TextBox_KeyUp(object sender, KeyEventArgs e)
{
  if(..) // your condition
  {
    e.SuppressKeyPress = false;
  }
  else
  {
    e.SuppressKeyPress = true;
  }
}

или

void TextBox_KeyUp(object sender, KeyEventArgs e)
{
   e.SuppressKeyPress = CheckInput(e.KeyValue); // where CheckInput is boolean method
}
0 голосов
/ 06 марта 2009

Я не думаю, что колесо было изобретено (по крайней мере, в .NET Framework). Я уверен, что в CodeProject и т. П. Есть что-то похожее на то, что есть у вас, так что это может стоить Google.

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

Чрезмерно упрощенный пример: вы можете обработать OnKeyPress, сделать Float.TryParse с добавленным новым символом. Если true, удерживайте нажатой клавишу; если false, отмените его (e.Handled = true).

Сложная часть - что делать, если они удаляют, вырезают или вставляют выделение. Другое дело, когда они только начинают (вы можете принять «-» как частичный допустимый ввод) ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...