我的控件的窗體上了一把:將責任委託給WinForm控件 - 控件應該知道對方的行爲?
- 複選框負責啓用/禁用基於其選中狀態頁面上的所有其他控件。
- 幾個單選按鈕,其負責啓用/根據自己的檢查狀態頁面上禁用特定的控制。
- 其通過上述控制操作的其他控件。
幾個方案中可能出現:
- 當表單初始化,我加載複選框的狀態。然後,它啓用或禁用窗體上的其他控件。
- 作爲形式繼續初始化,我加載單選按鈕的狀態。如果單選按鈕被選中但被禁用,這有機會撤銷先前的要求。因此,我檢查以確保首先啓用單選按鈕。形式加載
- 之後,用戶可以選擇或取消選擇的單選按鈕。這是一個微不足道的例子,我只是運行符合最後要求的代碼。另一種情況是,用戶可以選中/取消選中複選框。當複選框變爲啓用時,它希望重新啓用頁面上的所有控件,因爲它禁用了它們。但是,這樣做會破壞單選按鈕的要求。
這種情況是相當瑣碎與蠻力來處理。我創建了幾個方法來突出:
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的邏輯。這是不錯的編程習慣嗎?
這個問題沒有多大意義,這些已經存在於* form *中的代碼片段。或者UserControl,不知道。沒有代碼在控件類中。這是事件的全部內容,讓某種*其他代碼知道發生了一些有趣的事情。這個代碼非常屬於這種形式,它是唯一知道它所託管的控件集合的任何類。 –
嘿,對不起。我同意 - 我最初的帖子沒有足夠的意義。今天我會編輯它,當我有一點時間讓它更容易理解爲傳統目的。不過,我很困惑你的第二點。如果涉及單個課程的情況下不會使用事件,那麼呢?你有閱讀我支持嗎?代碼位於加載到表單上的用戶控件上。 –