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