我正在使用C# Windows Forms创建一个简单的表单,在其中遇到了一个常见情况,即一个控件可以改变另一个控件的状态,但是这两个控件的事件都会触发其他方法。
例如,考虑一个复选框和一个数字选择框,其中任何一个的状态或值都应该触发某些重绘操作。数字选择框依赖于复选框,这意味着除非复选框被选中,否则它可能会被禁用或忽略。
然而,用户更改数字选择框的值并自动选中复选框(如果尚未选中)是很方便的。
因此,以下是相关的方法:
当然,问题在于更改
我的解决方法是引入一个布尔变量,在其中可以有效地否定此行为,但有时可能会变得混乱。
例如,考虑一个复选框和一个数字选择框,其中任何一个的状态或值都应该触发某些重绘操作。数字选择框依赖于复选框,这意味着除非复选框被选中,否则它可能会被禁用或忽略。
然而,用户更改数字选择框的值并自动选中复选框(如果尚未选中)是很方便的。
因此,以下是相关的方法:
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 _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;
}
这是处理这种情况的最佳方式吗?
RedrawStuff
是一个不太好的命名选择。在这种情况下,它涉及重新查询数据库,更改多个数据绑定,并更改一些控件和面板状态,例如隐藏组等。 - JYelton