我在 C# Windows 窗体中创建一个简单的窗体并遇到一种常见情况,其中一个控件可以更改另一个控件的状态,但两个控件的事件都会触发其他一些方法。
例如,考虑一个 Checkbox
和 NumericUpDown
,其中任何一个的状态或值都应该触发重绘。 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/