vb.net:datetimerpicker介意触发值更改

时间:2018-09-25 07:25:06

标签: vb.net events datetimepicker

我有以下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属性的行的注释,那么第一次选择一个新日期的方式如上所述,但是一旦我想再次选择一个新日期,这是怎么回事:

  1. 在日期选择器出现之前,日期更改回 注意并触发valueChange事件
  2. 仍然在日期选择器出现之前,日期更改回其 原始值,然后再次触发valueChange事件
  3. 现在出现日期选择器,我可以选择一个新日期,如果选择了该日期,则再次触发valueChnage事件

实际上,如果设置好心意,那么我会看到该事件被触发了3次,这根本没有任何意义。

有什么想法可以解决这个问题吗?

2 个答案:

答案 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之后添加它,以确保在这些行上不会触发