在 NumericUpDown 控件中设置固定值
Set fixed Values in a NumericUpDown control
与设置 NumericUpDown
的最小值和最大值相比,如何让用户仅在不同的预设值之间设置 select? (例如 5、8、10、15、20、25)。
编辑:我能否通过 1) 单击 numericUpDown 的箭头和 2) 使用键盘手动更改值来区分 ValueChanged 事件?
控件本身不支持,需要手动处理。将方法附加到 ValueChanged
事件并检查该值是否是其中之一。如果不是,则适当调整。
如果允许的值至少相隔两个值,您可以轻松检查它是上升还是下降,而不需要存储以前的值来确定。
由于这些值不连续,因此 NumericUpDown 可能不是此用例的正确控件。
如果您只有六个左右的值,那么组合框将是更好的选择。
如果您有更多,那么带验证的文本框可能会更好。
如果您确实设置了 NumericUpDown 控件,那么正如其他人所指出的那样,您需要连接到 ValueChanged 事件并在那里进行验证。
尝试:
Public Class Form1
' NumericUpDown1
'.Minimum = 1
'.Maximum = 64
'.Increment = 1
'.value = 4
Dim NumList() As Integer = {1, 2, 4, 8, 16, 32, 64} ' list of admitted values
Dim NumExValue As Integer = 4 ' put the default value on numericUpDown
Dim NumDoChange As Boolean = True ' used for not looping in changeValue event
Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged
' if the event is calling from this event (when set .value) do nothing
If (NumDoChange = False) Then Exit Sub
With NumericUpDown1
Dim cv As Integer = .Value
' if no change (possible?) do nothing
If (cv = NumExValue) Then Exit Sub
' if the value IS on array do nothing
Dim ix As Integer = Array.IndexOf(NumList, cv)
If (ix >= 0) Then
NumExValue = cv
Exit Sub
End If
' if precedent value is 8 and up arrow pressed
' the current value is 9 so i search the index in array of
' value -1 and i take next element
If (cv > NumExValue) Then ' up arrow
ix = Array.IndexOf(NumList, cv - 1) + 1 ' get next element
NumDoChange = False ' stop ValueChanged event
.Value = NumList(ix) ' here start a call to this event
NumDoChange = True ' reset ValueChange event on
End If
' the same but precedent element
If (cv < NumExValue) Then ' down arrow pressed
ix = Array.IndexOf(NumList, cv + 1) - 1
NumDoChange = False
.Value = NumList(ix)
NumDoChange = True
End If
NumExValue = .Value
End With
End Sub
End Class
与设置 NumericUpDown
的最小值和最大值相比,如何让用户仅在不同的预设值之间设置 select? (例如 5、8、10、15、20、25)。
编辑:我能否通过 1) 单击 numericUpDown 的箭头和 2) 使用键盘手动更改值来区分 ValueChanged 事件?
控件本身不支持,需要手动处理。将方法附加到 ValueChanged
事件并检查该值是否是其中之一。如果不是,则适当调整。
如果允许的值至少相隔两个值,您可以轻松检查它是上升还是下降,而不需要存储以前的值来确定。
由于这些值不连续,因此 NumericUpDown 可能不是此用例的正确控件。
如果您只有六个左右的值,那么组合框将是更好的选择。
如果您有更多,那么带验证的文本框可能会更好。
如果您确实设置了 NumericUpDown 控件,那么正如其他人所指出的那样,您需要连接到 ValueChanged 事件并在那里进行验证。
尝试:
Public Class Form1
' NumericUpDown1
'.Minimum = 1
'.Maximum = 64
'.Increment = 1
'.value = 4
Dim NumList() As Integer = {1, 2, 4, 8, 16, 32, 64} ' list of admitted values
Dim NumExValue As Integer = 4 ' put the default value on numericUpDown
Dim NumDoChange As Boolean = True ' used for not looping in changeValue event
Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged
' if the event is calling from this event (when set .value) do nothing
If (NumDoChange = False) Then Exit Sub
With NumericUpDown1
Dim cv As Integer = .Value
' if no change (possible?) do nothing
If (cv = NumExValue) Then Exit Sub
' if the value IS on array do nothing
Dim ix As Integer = Array.IndexOf(NumList, cv)
If (ix >= 0) Then
NumExValue = cv
Exit Sub
End If
' if precedent value is 8 and up arrow pressed
' the current value is 9 so i search the index in array of
' value -1 and i take next element
If (cv > NumExValue) Then ' up arrow
ix = Array.IndexOf(NumList, cv - 1) + 1 ' get next element
NumDoChange = False ' stop ValueChanged event
.Value = NumList(ix) ' here start a call to this event
NumDoChange = True ' reset ValueChange event on
End If
' the same but precedent element
If (cv < NumExValue) Then ' down arrow pressed
ix = Array.IndexOf(NumList, cv + 1) - 1
NumDoChange = False
.Value = NumList(ix)
NumDoChange = True
End If
NumExValue = .Value
End With
End Sub
End Class