vb.net:datetimerpicker mindate 触发值更改
vb.net: datetimerpicker mindate fires value change
我有以下 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,日期 select 或出现,我 select 一个新日期和 ValueChange 事件被触发,所以我看到一个带有 selected 日期的消息框。如果我再次 select 一个新的日期,同样的事情会再次发生。
但是!如果我取消注释设置 mindate 属性 的行,那么 select 第一次使用新日期会像上面一样工作,但是一旦我想再次 select 一个新日期,发生的事情是这样的:
- 日期select之前或出现日期变回
mindate 和 valueChange 事件被触发
- 还在日期之前select或出现日期变回原来的日期
原始值和 valueChange 事件再次被触发
- 现在日期 select 或出现,我可以 select 一个新日期,如果我这样做,那么 valueChnage 事件将再次触发
所以实际上,如果设置了 mindate,那么我会看到事件被触发了 3 次,这根本没有意义。
有什么办法解决这个问题吗?
我测试了一下,看起来有点问题。
如果我更改月份,它会无缘无故地进入无限触发事件循环。
我想出了一个解决方案,它可能对你有帮助:
我们必须更改要处理的事件,从 .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:
为了确保一切正常,删除加载事件表单中的处理程序,如下所示:
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
的声明之后添加它,只是为了确保这些行不会触发任何内容
所以我找到的解决方案并不是真正的解决方案,而是一种解决方法。如果将 minDate 属性 设置为未来,则 DateTimePicker 似乎无法正常工作,例如:myDate.minDate= today.addDays(1)
在我的例子中。
注意 1:如果将 mindate 设置为今天,则不会出现此问题,甚至 myDate.minDate = today.addDays(-1)
也可以正常工作。看来它的未来有问题 "only".
注意 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
我有以下 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,日期 select 或出现,我 select 一个新日期和 ValueChange 事件被触发,所以我看到一个带有 selected 日期的消息框。如果我再次 select 一个新的日期,同样的事情会再次发生。
但是!如果我取消注释设置 mindate 属性 的行,那么 select 第一次使用新日期会像上面一样工作,但是一旦我想再次 select 一个新日期,发生的事情是这样的:
- 日期select之前或出现日期变回 mindate 和 valueChange 事件被触发
- 还在日期之前select或出现日期变回原来的日期 原始值和 valueChange 事件再次被触发
- 现在日期 select 或出现,我可以 select 一个新日期,如果我这样做,那么 valueChnage 事件将再次触发
所以实际上,如果设置了 mindate,那么我会看到事件被触发了 3 次,这根本没有意义。
有什么办法解决这个问题吗?
我测试了一下,看起来有点问题。 如果我更改月份,它会无缘无故地进入无限触发事件循环。
我想出了一个解决方案,它可能对你有帮助:
我们必须更改要处理的事件,从 .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:
为了确保一切正常,删除加载事件表单中的处理程序,如下所示:
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
的声明之后添加它,只是为了确保这些行不会触发任何内容
所以我找到的解决方案并不是真正的解决方案,而是一种解决方法。如果将 minDate 属性 设置为未来,则 DateTimePicker 似乎无法正常工作,例如:myDate.minDate= today.addDays(1)
在我的例子中。
注意 1:如果将 mindate 设置为今天,则不会出现此问题,甚至 myDate.minDate = today.addDays(-1)
也可以正常工作。看来它的未来有问题 "only".
注意 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