c# - 在 C# Windows 窗体中更改控件状态时如何忽略触发的简单事件?

标签 c# winforms events

我在 C# Windows 窗体中创建一个简单的窗体并遇到一种常见情况,其中一个控件可以更改另一个控件的状态,但两个控件的事件都会触发其他一些方法。

例如,考虑一个 CheckboxNumericUpDown,其中任何一个的状态或值都应该触发重绘。 NumericUpDown 依赖于 Checkbox,这意味着它可以被禁用或忽略,除非选中 Checkbox

但是,用户可以方便地更改 NumericUpDown 值,并自动检查 Checkbox(如果尚未检查)。

下面是有问题的方法:

private void chkState_CheckedChanged(object sender, EventArgs e)
{
    RedrawStuff();
}

private void numStateValue_ValueChanged(object sender, EventArgs e)
{
    if (!chkState.Checked)
        chkState.Checked = true;
    RedrawStuff();
}

当然,问题在于更改 NumericUpDown 值会导致 RedrawStuff() 触发两次。

我的解决方法是引入一个 bool 值,我可以有效地否定这种行为,但有时它会变得困惑:

bool _preventStateChange;

private void chkState_CheckedChanged(object sender, EventArgs e)
{
    if (_preventStateChange)
        return;
    RedrawStuff();
}

private void numStateValue_ValueChanged(object sender, EventArgs e)
{
    _preventStateChange = true;
    if (!chkState.Checked)
        chkState.Checked = true;
    RedrawStuff();
    _preventStateChange = false;
}

这是处理这种情况的最佳方式吗?

最佳答案

对于更一般的情况,如果控件之间有复杂的关系,您可以通过检查它自己的 Focused 属性来检查哪个控件触发了事件:

private void chkState_CheckedChanged(object sender, EventArgs e)
{
    if (chkState.Focused)
        RedrawStuff();
}

private void numStateValue_ValueChanged(object sender, EventArgs e)
{
    if (!chkState.Checked)
        chkState.Checked = true;

    if (numStateValue.Focused)
        RedrawStuff();
}

这样,每个对象只依赖于它自己。

据我所知,对象必须具有焦点才能触发用户事件,并且在任何给定时间只能有一个对象具有焦点。但是,我不确定它是否适用于所有情况,因此仍需要测试。

关于c# - 在 C# Windows 窗体中更改控件状态时如何忽略触发的简单事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6604506/

相关文章:

c# - 无法为 GridView 中动态创建的按钮连接 Click 事件

c# - 从源文件中删除所有注释(单行/多行)和空行

c# - 一个winform来添加和更新数据

.net - WinForms 4K 和 1080p 缩放/高 DPI?

c++ - 在 C++ 中,有没有办法让 Child 重用 GrandParent 中定义的纯虚函数的 Parent 类实现

javascript - 在文本框中粘贴某些文本时是否检查数字(没有设置超时)

javascript - C# Selenium 无法定位用 Javascript 编写的隐藏元素

c# - 哪个更好 : dictionary or hashtable

C#: tail like 文本文件程序

c# - 在不直接更改 SelectedIndex 的情况下设置 ComboBox 默认值