我有以下vb.net代码:
Public Class TEMP
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'myDate.MinDate = Today.AddDays(1)
myDate.Value = Today.AddDays(1)
End Sub
Private Sub HCheckOutDate_ValueChanged(sender As Object, e As EventArgs) Handles myDate.ValueChanged
MsgBox(myDate.Value)
End Sub
End Class
在此代码中,“ myDate”是DateTimePicker GUI元素。
如果我运行这样的代码(请注意,注释掉了一行),那么一切都会按预期进行:单击DateTimePicker后,将显示日期选择器,然后选择一个新日期,并触发ValueChange事件,因此查看带有所选日期的消息框。如果我再次选择一个新日期,同样的事情会再次发生。
但是!如果我取消对设置mindate属性的行的注释,那么第一次选择一个新日期的方式如上所述,但是一旦我想再次选择一个新日期,这是怎么回事:
实际上,如果设置好心意,那么我会看到该事件被触发了3次,这根本没有任何意义。
有什么想法可以解决这个问题吗?
答案 0 :(得分:1)
因此,我找到的解决方案并不是真正的解决方案,而是解决方法。如果将minDate属性设置为将来,则DateTimePicker似乎无法正常工作,例如:在我的情况下为myDate.minDate= today.addDays(1)
。
注意1:如果将主意设置为今天,甚至myDate.minDate = today.addDays(-1)
都可以正常工作,则不会出现此问题。似乎未来的“仅”有问题。
注2:在新代码中,我暂时禁用valueChange事件。一次是在窗体加载时,所以对象的初始化不会触发事件,而一次是由于用户更改日期而触发事件。用户可能选择了当前日期(今天),但实际上我们应该应用的第一个日期是明天,因此datetimepicker的值可能会再次更改。在那里禁用该事件意味着该事件仅触发一次。
正如我所说,这实际上只是一种解决方法。我不知道日期选择器如何处理myDate.minDate = today.addDays(1)
Public Class TEMP
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
RemoveHandler myDate.ValueChanged, AddressOf myDate_ValueChanged
myDate.MinDate = Today
AddHandler myDate.ValueChanged, AddressOf myDate_ValueChanged
End Sub
Private Sub myDate_ValueChanged(sender As Object, e As EventArgs) Handles myDate.ValueChanged
If myDate.Value.Date = Today.Date Then
RemoveHandler myDate.ValueChanged, AddressOf myDate_ValueChanged
myDate.Value = Today.AddDays(1)
AddHandler myDate.ValueChanged, AddressOf myDate_ValueChanged
End If
MsgBox(myDate.Value)
End Sub
End Class
答案 1 :(得分:0)
我对其进行了一些测试,看起来好像有点bug。 如果我更改了月份,它将无缘无故地进入无限触发事件循环。
我提出了一个 解决方案 ,它可能会对您有所帮助:
我们必须将事件处理从.ValueChanged
更改为.TextChanged
。
该程序的行为与用户砍伐的行为相同,但是现在它不会无缘无故地触发。
所以基本上:
Private Sub HCheckOutDate_TextChanged(sender As Object, e As EventArgs)
MsgBox(myDate.Value)
End Sub
备注:
使用myDate.Value = Today
代替Today.AddDays(1)
。
Today.AddDays(1)
表示您的最小约会时间是明天(今天+ 1),我认为这可能就是其行为很奇怪的原因。
备注2:
为确保一切正常,请删除load事件表单中的处理程序,如下所示:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
RemoveHandler myDate.TextChanged, addressOf HCheckOutDate_TextChanged
myDate.MinDate = Today.addDays(1)
'myDate.Value = Today.addDays(1) this is a repetition. MinDate will do the same thing
AddHandler myDate.TextChanged, addressOf HCheckOutDate_TextChanged
End Sub
然后您可以在声明MinValue
之后添加它,以确保在这些行上不会触发