フォームにいくつかのコントロールがあります。
- チェックされた状態に基づいて、ページ上の他のすべてのコントロールを有効/無効にするチェックボックス。
- チェックされた状態に基づいて、ページ上の特定のコントロールを有効/無効にする役割を持ついくつかのラジオ ボタン。
- 上記のコントロールによって操作されるその他のコントロール。
いくつかのシナリオが発生します。
- フォームが初期化されると、チェックボックスの状態が読み込まれます。次に、フォーム上の残りのコントロールを有効または無効にします。
- フォームの初期化が続くので、ラジオ ボタンの状態を読み込みます。ラジオボタンがチェックされているが無効になっている場合、これにより、以前の要件が取り消される可能性があります。そのため、最初にラジオボタンが有効になっていることを確認します。
- フォームが読み込まれた後、ユーザーはラジオ ボタンをオンまたはオフにすることができます。これは些細なケースです。最後の要件を満たすコードを実行しただけです。ただし、別のケースとして、ユーザーがチェックボックスをオンまたはオフにする場合があります。チェックボックスが有効になると、ページ上のすべてのコントロールを無効にしたため、再度有効にする必要があります。ただし、これを行うと、ラジオ ボタンの要件に違反します。
このシナリオは、力ずくで処理するのは非常に簡単です。強調するためにいくつかのメソッドを作成しました。
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.
レイアウトの大まかなアイデア:
そうは言っても、私の質問は「単純」です。
- メソッドは、他のメソッドが存在することを前提とせずに機能する必要があります。それでも、chkBx の存在に対する rdBtn の論理的ネットワークを維持すると、コードが互いに争わなければならないことになります。
次のようにコードを書くことができます:
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 のロジックに依存する必要があることも意味します。これは良いプログラミング手法ですか?