4

在 C# Windows 窗体中是否可以区分checkbox通过用户单击切换和源自另一个事件的更新?

我有一个listbox值和一个面板,checkboxes其中包含有关列表框中项目的是/否信息。当列表框中的一个项目被选中时,我想checkboxes用它的信息来更新。复杂之处在于其中一个checkboxes代表一个独特的状态,只有其中一个项目listbox被允许拥有的东西。如果用户在它处于未选中状态时单击checkbox它,我希望它为当前选定的项目设置字段为真,为之前保持它为真的任何项目设置为假。

据我了解,该CheckedChanged事件将在listbox选择更改(设置该checkbox项目的值)和用户单击时触发。我需要一种方法将它们分开。

我怎么做?

4

2 回答 2

1

这是一个快速示例,显示了复选框上单击事件的执行顺序:

Private Sub CheckBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.MouseDown
    Dim a As Integer = 1
End Sub

Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
    Dim a As Integer = 2
End Sub

Private Sub CheckBox1_Clicked(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.Click
    Dim a As Integer = 3
End Sub

Private Sub CheckBox1_MouseClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.MouseClick
    Dim a As Integer = 4
End Sub

Private Sub CheckBox1_MouseUp(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.MouseUp
    Dim a As Integer = 5
End Sub

如果您在每个声明上设置断点,您会注意到在 CheckChanged 之前只触发了 MouseDown 事件。这意味着如果您想查看用户是否单击了复选框,则必须在 CheckBox.MouseDown 子中触发一个事件。请注意,任何时候用户单击此复选框都会触发此事件,即使他们在按住鼠标的同时将鼠标拖出它也不会更新检查更改事件。这只是意味着您必须在 MouseUp 子中触发后续事件以清除标志。

处理它的一种方法是这样的:

Private blIsUserClick As Boolean

Private Sub CheckBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.MouseDown
    blIsUserClick = True
End Sub

Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
    If blIsUserClick Then
        'Is a user click event
    Else
        'Not a user click event
    End If
End Sub

Private Sub CheckBox1_MouseUp(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.MouseUp
    blIsUserClick  = False
End Sub
于 2013-09-11T20:04:03.287 回答
0

据我了解, CheckedChanged 事件将在列表框选择更改(设置该项目的复选框值)和用户单击时触发。我需要一种方法将它们分开。

是的,你是对的,当你更新状态CheckedChanged时会引发事件(我猜是在引发事件或类似的事情时你会这样做)。checkBoxListBox.SelectedIndexChanged

您需要在更新CheckBox状态之前禁用处理程序。

private void myListBox_SelectedIndexChanged(object sender, System.EventArgs e)
{
    //disable checkbox event
    mycheckbox.CheckedChanged -= mycheckbox_CheckedChanged;

    //you can change the checkbox state here
    //...

    //Activate event
    mycheckbox.CheckedChanged += myListBox_SelectedIndexChanged;
}

private void mycheckbox_CheckedChanged(object sender, System.EventArgs e)
{
    //(...)
}

另一种可能的模式是使用标志,以便在通过代码CheckedChanged更新状态期间不要监听事件。checkbox

private bool flagactivated = true;

private void myListBox_SelectedIndexChanged(object sender, System.EventArgs e)
{
    //disable checkbox event
    flagactivated = false;

    //Do stuff
    //(...)

    //Activate event
    flagactivated = true;
}

private void mycheckbox_CheckedChanged(object sender, System.EventArgs e)
{
    if (flagactivated) 
    {
        //do stuff
    }
}
于 2013-09-11T19:54:14.393 回答