Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows窗体复选框已更改还是已更新?_C#_.net_Winforms - Fatal编程技术网

C# Windows窗体复选框已更改还是已更新?

C# Windows窗体复选框已更改还是已更新?,c#,.net,winforms,C#,.net,Winforms,在C#Windows窗体中,是否可以区分通过用户单击切换的复选框,以及来自其他事件的更新 我有一个值的列表框,还有一个复选框面板,其中包含列表框中项目的是/否信息。当列表框中的某个项目被选中时,我想用它的信息更新复选框。当一个复选框表示一个唯一的状态时,就会出现复杂的情况,只有列表框中的一个项目才允许具有这种状态。如果用户在未选中状态下单击该复选框,我希望它为当前选定的项目设置字段true,并为之前保持为true的项目设置字段false 据我所知,CheckedChanged事件将在列表框选择更

在C#Windows窗体中,是否可以区分通过用户单击切换的
复选框
,以及来自其他事件的更新

我有一个值的
列表框
,还有一个
复选框面板
,其中包含列表框中项目的是/否信息。当列表框中的某个项目被选中时,我想用它的信息更新
复选框
。当一个
复选框
表示一个唯一的状态时,就会出现复杂的情况,只有
列表框
中的一个项目才允许具有这种状态。如果用户在未选中状态下单击该
复选框
,我希望它为当前选定的项目设置字段true,并为之前保持为true的项目设置字段false

据我所知,
CheckedChanged
事件将在
列表框
选择更改(设置该项目的
复选框
值)和用户单击时触发。我需要一个办法把他们分开

我该怎么做

据我所知,CheckedChanged事件将在 列表框选择更改(设置该项的复选框值) 然后在用户界面上单击。我需要一个办法把他们分开

是的,您是对的,当您更新
复选框
状态时,将引发
CheckedChanged
事件(您在
ListBox.SelectedIndexChanged
事件或类似事件时会引发该事件)

您需要的是在更新
复选框
状态之前禁用处理程序

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
事件

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
    }
}

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

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子框中触发事件。请注意,用户在任何时候单击此复选框时,都会触发此事件,即使他们在按住鼠标的同时将鼠标从复选框中拖出,这不会更新check changed事件。这只意味着您必须在MouseUp sub中触发后续事件以清除标志

一种处理方法是这样的:

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

你能解释一下为什么要把它们分开吗?例如,两个事件一个在
CheckedChanged
上,另一个在
Click
上是否可以接受?或者您的数据源是否绑定了复选框以公开一个事件,该事件在您可以订阅的更改时触发,以显示差异?请澄清:这是一个
CheckedListBox
还是一个离散的
复选框
。它们不一样。这不是XY问题,你已经记下了问题陈述。添加一个成员bool感觉很不舒服,但这对我来说应该有用。@CPS你可能是对的。我将删除它:)如果挂上CellClick可能不是更好,我想指出的是。当然,您也可以分离CheckedChanged事件的处理程序(-=),以避免使用bool。我将更新我的答案。如果使用键盘更改复选框(选项卡将焦点更改为复选框,空格将其切换,或者在设计器中文本中的ALT+快捷键字母前面使用键盘快捷键-“&”),则这将不起作用。