Winform Checkbox MouseDown 事件处理程序不允许触发 CheckedChanged 事件

Winform Checkbox MouseDown event handler not allowing CheckedChanged event to fire

我有一个 WinForm,其中包含大量在可见性和内容方面相互依赖的控件。 我有一对单选按钮,控制组合框的 (ComboBoxA) enable/disable 标志和内容。此组合框上的选择控制复选框的可见性。选中此复选框可控制另一个组合框 (ComboBoxB) 的可见性和内容。围绕这些控件的业务需求非常复杂。因此,我需要能够以编程方式和通过用户操作触发事件,在每种情况下做不同的事情。

在复选框的情况下,我在加载数据时以编程方式检查它(如果需要),这会触发 CheckedChanged 事件,该事件反过来会执行其他操作来控制 ComboBoxB。这个代码很普通,没什么特别的,但我的问题是理论多于实际。请继续阅读。

由于这个要求,我需要一种方法来区分程序检查和用户操作。我尝试使用 Click 事件和 CheckedChanged 事件,在 click 事件中设置一个标志,表示用户操作。不幸的是,CheckedChanged 事件在 Click 事件之前触发,这导致了这个技巧的死胡同。

现在,我尝试使用 MouseDown 事件来捕获用户操作。但有趣的是,一旦事件触发,复选框将保持未选中状态并且 CheckedChanged 事件不会触发。

现在,我已经设法在代码中使用一个标志来确定程序检查并使用它来区分两者,但我很好奇为什么 MouseDown 事件不允许检查复选框。有任何想法吗?我在网上搜索过,但要么我没有彻底搜索,要么 google 没有为我返回正确的结果。如果有人真的能够找到此问题的 google 结果,我深表歉意。

这是您代码中的其他内容,而不是阻止 CheckChanged 被触发的 MouseDown 事件。
我是这样知道的:
我在一个空表单中添加了一个复选框和一个按钮,并将事件处理程序添加到按钮上的 Click,以及复选框 CheckedChangedKeyDownMouseDown 事件.我还在表单中添加了一个名为 LastEventRaised 的字符串变量,在 CheckedChanged 中我只显示了一个 MessageBox:

string LastEventRaised = string.Empty;
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    MessageBox.Show("Checked changed " + LastEventRaised);
    LastEventRaised = string.Empty;
}

private void checkBox1_KeyDown(object sender, KeyEventArgs e)
{
    LastEventRaised = "KeyDown";
}

private void checkBox1_MouseDown(object sender, MouseEventArgs e)
{
    LastEventRaised = "MouseDown";
}

private void button1_Click(object sender, EventArgs e)
{
    LastEventRaised = "programmatically";
    checkBox1.Checked = !checkBox1.Checked;
}

每次弹出消息框时,我都会收到正确的消息。