VB.NET WinForms日期时间选择器更改事件运行两次?

VB.NET WinForms日期时间选择器更改事件运行两次?,vb.net,winforms,datepicker,controls,Vb.net,Winforms,Datepicker,Controls,当用户更改我的“结束”日期DateTinePicker控件上的日期时,我会运行以下代码: Private Sub dtpEndDate_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dtpEndDate.ValueChanged If dtpEndDate.Value.Date < dtpStartDate.Value.Date Then Messag

当用户更改我的“结束”日期DateTinePicker控件上的日期时,我会运行以下代码:

Private Sub dtpEndDate_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dtpEndDate.ValueChanged
    If dtpEndDate.Value.Date < dtpStartDate.Value.Date Then
        MessageBox.Show("The end date should be after the start date", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error)
        dtpEndDate.Value = Today
    End If
End Sub
Private Sub dtpEndDate_ValueChanged(ByVal发送方作为System.Object,ByVal e作为System.EventArgs)处理dtpEndDate.ValueChanged
如果dtpEndDate.Value.Date
这个过程似乎运行了两次,messagebox显示了两次

我是否有错误的事件,或者是否有更好的管理方法

我尝试使用建议的变量编辑它:

Private Sub dtpEndDate_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dtpEndDate.ValueChanged

If m_blndtpEndDateIsDone = False Then
    If dtpEndDate.Value.Date < dtpStartDate.Value.Date Then
        MessageBox.Show("The end date should be after the start date", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error)
        m_blndtpEndDateIsDone = True
        dtpEndDate.Value = Today
    Else
        m_blndtpEndDateIsDone = False
    End If
Else
    m_blndtpEndDateIsDone = False
End If
wnd sub
Private Sub dtpEndDate_ValueChanged(ByVal发送方作为System.Object,ByVal e作为System.EventArgs)处理dtpEndDate.ValueChanged
如果m_blndtpEndDateIsDone=False,则
如果dtpEndDate.Value.Date
不幸的是它仍然发射了两次

我希望它在每次修改结束日期dtpicker并且日期早于开始日期时触发一次

谢谢


菲利普这件事过去常发生在我身上

您可以证明您至少在WebForms中的两个位置处理事件:在asp页面和代码隐藏中。如果我在代码中的“dtpEndDate\u ValueChanged”方法签名后有语法“Handles dtpEndDate.ValueChanged”,如上图所示,那么我不必在我的aspx“OnClick=“dtpEndDate\u ValueChanged”或类似的东西中写入

当您在WinForms中而不是在WebForms中时,请确保您没有

或者类似于加载方法中的某个地方或其他地方

希望有帮助


伊夫

这曾经发生在我身上

您可以证明您至少在WebForms中的两个位置处理事件:在asp页面和代码隐藏中。如果我在代码中的“dtpEndDate\u ValueChanged”方法签名后有语法“Handles dtpEndDate.ValueChanged”,如上图所示,那么我不必在我的aspx“OnClick=“dtpEndDate\u ValueChanged”或类似的东西中写入

当您在WinForms中而不是在WebForms中时,请确保您没有

或者类似于加载方法中的某个地方或其他地方

希望有帮助


Yves

您可以使用dtpEndDate\u验证事件

Private Sub dtpEndDate_Validating(sender As Object, e As CancelEventArgs)
    If dtpEndDate.Value.[Date] < dtpStartDate.Value.[Date] Then
        MessageBox.Show("The end date should be after the start date", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.[Error])
    End If
   e.Cancel = True
End Sub
私有子dtpEndDate_验证(发送方作为对象,e作为CancelEventArgs)
如果dtpEndDate.Value.[Date]

如果要处理事件(dtpEndDate_ValueChanged),请在表单中定义一个布尔变量,并将该值设置为false。在执行第一次消息框后的事件中,将变量设置为true。然后检查这个变量

Dim isDone As Boolean = False

Private Sub dtpEndDate_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dtpEndDate.ValueChanged
If Not isDone Then
 If dtpEndDate.Value.Date < dtpStartDate.Value.Date Then
    MessageBox.Show("The end date should be after the start date", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error)
    IsDone = True
    dtpEndDate.Value = Today
 End If
End If
Dim isDone作为布尔值=False
私有子dtpEndDate_ValueChanged(ByVal发送方作为System.Object,ByVal e作为System.EventArgs)处理dtpEndDate.ValueChanged
如果不是的话
如果dtpEndDate.Value.Date

结束子项

您可以使用dtpEndDate\u验证事件

Private Sub dtpEndDate_Validating(sender As Object, e As CancelEventArgs)
    If dtpEndDate.Value.[Date] < dtpStartDate.Value.[Date] Then
        MessageBox.Show("The end date should be after the start date", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.[Error])
    End If
   e.Cancel = True
End Sub
私有子dtpEndDate_验证(发送方作为对象,e作为CancelEventArgs)
如果dtpEndDate.Value.[Date]

如果要处理事件(dtpEndDate_ValueChanged),请在表单中定义一个布尔变量,并将该值设置为false。在执行第一次消息框后的事件中,将变量设置为true。然后检查这个变量

Dim isDone As Boolean = False

Private Sub dtpEndDate_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dtpEndDate.ValueChanged
If Not isDone Then
 If dtpEndDate.Value.Date < dtpStartDate.Value.Date Then
    MessageBox.Show("The end date should be after the start date", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error)
    IsDone = True
    dtpEndDate.Value = Today
 End If
End If
Dim isDone作为布尔值=False
私有子dtpEndDate_ValueChanged(ByVal发送方作为System.Object,ByVal e作为System.EventArgs)处理dtpEndDate.ValueChanged
如果不是的话
如果dtpEndDate.Value.Date
End Sub

试试这个

Private Sub dtpEndDate_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dtpEndDate.ValueChanged

     If (dtpEndDate.Value.Date < dtpStartDate.Value.Date) And Not dtpEndDate.Value = Today Then
            MessageBox.Show("The end date should be after the start date", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error)
            dtpEndDate.Value = Today
     End If

 End Sub
Private Sub dtpEndDate_ValueChanged(ByVal发送方作为System.Object,ByVal e作为System.EventArgs)处理dtpEndDate.ValueChanged
如果(dtpEndDate.Value.Date
您正在用
今天的日期重置
dtpEndDate
上的日期,因此您的
dtpStartDate
应该小于
今天的日期
,因此使用上述代码不会发生逻辑冲突。

尝试一下

Private Sub dtpEndDate_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dtpEndDate.ValueChanged

     If (dtpEndDate.Value.Date < dtpStartDate.Value.Date) And Not dtpEndDate.Value = Today Then
            MessageBox.Show("The end date should be after the start date", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error)
            dtpEndDate.Value = Today
     End If

 End Sub
Private Sub dtpEndDate_ValueChanged(ByVal发送方作为System.Object,ByVal e作为System.EventArgs)处理dtpEndDate.ValueChanged
如果(dtpEndDate.Value.Date