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