我在表单上有一些控件:
- 一个复选框,负责根据其选中状态启用/禁用页面上的所有其他控件。
- 一些单选按钮负责根据其选中状态启用/禁用页面上的特定控件。
- 由上述控件操作的其他控件。
出现了几种情况:
- 当表单初始化时,我加载复选框的状态。然后,它启用或禁用窗体上的其余控件。
- 随着表单继续初始化,我加载了单选按钮的状态。如果选中但禁用了单选按钮,则有可能撤消先前的要求。因此,我检查以确保首先启用单选按钮。
- 表单加载后,用户可以选中或取消选中单选按钮。这是一个微不足道的案例,我只是运行满足最后一个要求的代码。但是,另一种情况是用户可以选中/取消选中该复选框。当复选框启用时,它希望重新启用页面上的所有控件,因为它禁用了它们。但是,这样做会破坏单选按钮的要求。
用蛮力处理这种情况非常简单。我创建了几种方法来突出显示:
private void ChkBxSnmPv3OnCheckedChanged(object sender, EventArgs eventArgs)
{
snmpSettingsErrorProvider.Clear();
foreach (Control control in grpBxSNMPv3.Controls)
{
if (control != sender)
control.Enabled = ((CheckBox)sender).Checked;
}
}
private void rdBtnAuthNoPriv_CheckedChanged(object sender, EventArgs e)
{
RadioButton authNoPrivRadioButton = ((RadioButton)sender);
if (authNoPrivRadioButton.Enabled)
{
bool isChecked = authNoPrivRadioButton.Checked;
SetControlState(cmbBxAuthProtocol, isChecked);
SetControlState(mskdTxtBxAuthPassword, isChecked);
SetControlState(mskdTxtBxAuthPasswordConfirm, isChecked);
SetControlState(cmbBxPrivacyProtocol, !isChecked);
SetControlState(mskdTxtBxPrivacyPassword, !isChecked);
SetControlState(mskdTxtBxPrivacyPasswordConfirm, !isChecked);
}
}
//More methods for other checkedChange and also for when rdBtn's enable.
粗略的布局思路:
尽管如此,我的问题很“简单”:
- 方法应该在不假设存在其他方法的情况下工作。然而,如果我保留 rdBtn 对 chkBx 存在的逻辑,那么我将拥有必须相互对抗的代码。
我可以这样写我的代码:
private void ChkBxSnmPv3OnCheckedChanged(object sender, EventArgs eventArgs)
{
snmpSettingsErrorProvider.Clear();
txtBxEngineID = ((CheckBox)sender).Checked;
rdBtnAuthNoPriv = ((CheckBox)sender).Checked;
rdBtnAuthPriv = ((CheckBox)sender).Checked;
rdBtnNoAuthNoPriv = ((CheckBox)sender).Checked;
//Pass work for enabling Auth and Priv fields to rdBtn events.
}
这个解决方案更有效,并且保证我不会看到任何闪烁。然而,这也意味着为了“成功完成”启用页面上的所有控件,我的 chkBx 现在必须依赖 rdBtn 的逻辑。这是良好的编程习惯吗?