我在WinForms中有一个应用程序,我有很多控件。这些控件表示应用程序的设置,用户可以通过单击按钮来保存此设置。
我正在尝试解决NumericUpDown(我将其称为Num)控制的问题:让我们说Num有这些属性:
最低:10 最高:60 步骤:1
如果用户想要更改值,有两种方法可以执行此操作:单击箭头(Num的右侧)或手动将值直接键入Num。第一种方法是可以,但大多数用户使用第二种方式,并有一个小问题。
如果用户在例如1的间隔之外输入某个值,则可以,因为他可以继续输入5,因此最终值为51,这是在间隔内。但是如果他在值1之后停止输入,则意味着他在区间(1)之外输入值。如果他点击Num之外的某个地方,则值(超出间隔)将自动更改为最接近的允许值(如果为1,则值将更改为10)。
但是他可能不会注意到这种自动更改,所以我想以某种方式处理它,并通知他,他把那些无效值。但是这种情况不是由Num的任何事件处理的(没有办法找出他放在那里的这个无效值 - 如果我尝试读取ValueChanged事件中的值,它会自动读取更改的值,而不是无效的值)。 / p>
我知道我可以添加TextChanged
事件,但是如果他输入了一些无效值(5),则可以将其更改为有效值(通过添加1使其生成15)。
您对如何解决此问题有任何想法吗?我知道这是愚蠢的,但这不依赖于我,我必须这样做,我不知道如何。
答案 0 :(得分: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
或者您可以创建一个自定义控件,您可以在其中覆盖将值更改为最小值但我从未尝试过的事件。
答案 1 :(得分: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
在自动更改之前,因此我可以轻松控制该值是否有效。