2013-12-11 2 views
1

У меня есть приложение в WinForms, где у меня много элементов управления. Эти элементы управления представляют настройки приложения, и пользователь может сохранить эти настройки, нажав на кнопку.NumericUpDown Недопустимое значение

Я пытаюсь решить проблему с NumericUpDown (я буду называть его Num) управления: Допустим, что Num имеет следующие свойства:

Минимум: 10 Максимум: 60 Шаг: 1

Если пользователь хочет изменить значение, есть два способа сделать это: щелкнуть стрелки (правая сторона Num) или ввести вручную значение Num. Первый путь в порядке, но большинство пользователей используют второй способ, и есть небольшая проблема.

Если пользователь вводит некоторое значение из интервала, например, 1, это нормально, потому что он может продолжать печатать с 5, поэтому окончательное значение равно 51, и это находится внутри интервала. Но если он перестанет печатать после значения 1, это означает, что он вводит значение из интервала (1). Если он щелкнет где-нибудь из числа Num, значение (которое находится вне интервала) автоматически изменяется на ближайшее допустимое значение (в случае 1 значение будет изменено на 10).

Но он, вероятно, не заметит этого автоматического изменения, поэтому я хочу как-то справиться с ним и сообщить ему, что он помещает там недопустимое значение. Но эта ситуация не обрабатывается никаким событием Num (нет способа узнать это недопустимое значение, которое он поставил там - если я попытаюсь прочитать значение внутри события ValueChanged, он считывает автоматически измененное значение, а не недопустимое).

Я знаю, что могу добавить событие TextChanged, но есть проблема, что если он напечатает некоторое недопустимое значение (5), его можно будет заменить на действительное значение (добавив 1, чтобы оно составляло 15).

У вас есть идеи, как решить эту проблему? Я знаю, что это глупо, но это не зависит от меня, я должен это сделать, и я не знаю, как это сделать.

ответ

0

Так что это мое решение:

Я обрабатывать TextChanged события и внутри этого метода я назначу text его tag:

Private Sub NUDTextChanged() 
    Integer.TryParse(NUD.Text, NUD.Tag) 
End Sub 

И потом:

Private Sub NUD_LostFocus() Handles NUD.LostFocus 
    If NUD.Tag < NUD.Minimum Or NUD.Tag > NUD.Maximum Then 
     ' show message 
    End If 
End Sub 

Обработку Validating события бесполезно для меня, потому что автоматическое изменение допустимого значения до проверки и это автоматическое изменение срабатывает TextChange, поэтому после проверки у меня есть новое значение вместо недопустимого.

LostFocus перед автоматическим изменением, поэтому я могу легко контролировать, действительно ли это значение или нет.

1

Использование Lost Focus и вместо установки минимума на этапе проектирования проверьте его с помощью оператора If.

Private Sub Num_LostFocus(sender As Object, e As System.EventArgs) Handles Num.LostFocus 
    If Num.Value < 10 Then MsgBox("Number is incorrect") 
End Sub 

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

+0

Но что, если пользователь хочет установить значение со стрелками? Если не установлено минимальное и максимальное значение, он может легко перейти к недопустимому значению с помощью этих стрелок ... – DanielH

+0

используйте Num.ValueChanged, чтобы сохранить значение в пределах. – OSKM

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