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