在没有无限循环的情况下管理`CheckBox_Checked`事件

时间:2015-08-11 17:17:08

标签: vb.net winforms checkbox

我知道这似乎很容易解决,但我遇到了麻烦。我有一个CheckBox,选中后,我会删除DataGridViewWindows Form的数据来源,并移除少数ReadOnly的{​​{1}}个属性。< / p>

我知道Textbox事件会将我的代码发送到无限循环中,但我不知道哪个事件会在不改变每次CheckedChanged的情况下处理此更改。我尝试过使用CheckedStateClickMouseClick事件而没有运气。

这是我目前的代码:

CheckStateChanged

Private Sub chkManual_MouseClick(sender As Object, e As EventArgs) Handles chkManual.MouseClick If Not Me.chkManual.Checked Then Me.chkManual.Checked = False Me.cbRegion.SelectedIndex = -1 Me.txtIssueDate.ReadOnly = True Me.txtCasenum.ReadOnly = True Me.txtCommnum.ReadOnly = True Exit Sub Else Me.dgDataEntry.DataSource = Nothing Me.cbRegion.SelectedIndex = -1 Me.txtIssueDate.ReadOnly = False Me.txtCasenum.ReadOnly = False Me.txtCommnum.ReadOnly = False ClearForm() frmPDF.Hide() Exit Sub End If End Sub 的属性:CheckBox = AutoCheckTrue = CheckedFalse = CheckState

我已经研究过这些:

CheckBox_Checked event

Is there a simpler way to process check boxes?

CheckBox reverts to checked after being unchecked

How to check if a checkboxes state has changed

How can I prevent an assignment statement to CheckBox.Checked from raising the CheckChanged event?

http://www.vbforums.com/showthread.php?758455-CheckBox-code-got-stuck-in-an-infinite-loop-can-not-unchecked-it

修改

如果您的Unchecked子资源不会每次都将ClearForm()的{​​{1}}更改回CheckedState,这会有所帮助。谢谢@Visual Vincent指出显而易见的事。代码没有问题,将CheckBox更改为False

最终代码(如此简单):

EventHandler

3 个答案:

答案 0 :(得分:0)

您可以删除更改复选框状态的代码吗?例如:

Me.chkManual.Checked = False

该框将在您的代码不必执行的情况下进行检查或取消选中,并且该事件只会抛出一次。

答案 1 :(得分:0)

我认为最简单的方法是在处理复选框选中状态之前删除事件侦听器。使用try-finally块确保始终设置复选框事件侦听器。

Try
RemoveHandler chkManual AddressOf chkManual_MouseClick
Me.chkManual.Checked = False
...
Finally
AddHandler chkManual AddressOf chkManual_MouseClick
End Try

答案 2 :(得分:0)

我不确定你是否想要CheckBox在Checked时自动再次取消选中!?......看起来像是一个奇怪的界面。

无论如何,如果您想在检查状态发生变化时发生某些事情:

Private Sub chkManual_CheckedChanged(sender As Object, e As EventArgs) Handles chkManual.CheckedChanged
    If chkManual.Checked Then
        Debug.Print("Checked")
        Me.dgDataEntry.DataSource = Nothing
        Me.cbRegion.SelectedIndex = -1

        Me.txtIssueDate.ReadOnly = False
        Me.txtCasenum.ReadOnly = False
        Me.txtCommnum.ReadOnly = False
        ClearForm()

        frmPDF.Hide()
    Else
        Debug.Print("UnChecked")
        Me.cbRegion.SelectedIndex = -1

        Me.txtIssueDate.ReadOnly = True
        Me.txtCasenum.ReadOnly = True
        Me.txtCommnum.ReadOnly = True
    End If
End Sub

您可以取消选中没有无限循环的复选框,如下所示:

Private Sub chkManual_CheckedChanged(sender As Object, e As EventArgs) Handles chkManual.CheckedChanged
    Static counter As Integer
    If chkManual.Checked Then
        counter = counter + 1 ' just to show we're not in an infinite loop...
        Debug.Print("Checked " & counter) ' just to show we're not in an infinite loop...
        chkManual.Checked = False
    Else
        Debug.Print("UnChecked")
    End If
End Sub

不确定你为什么要这样做......看起来基本上就是&#34;重置&#34;按钮,因为它不能保持在检查状态...