私のフォームには、メニュー、パネル、スプリッター、ラベル、テキストボックスなど、何百ものコントロールがあります。
1つのボタンを除くすべてのコントロールを無効にする方法はありますか?
ボタンが重要である理由は、1つのコントロールがまだ使用可能である必要があるため、ウィンドウなどを無効にするメソッドを使用できないためです。
再帰呼び出しを実行して、関連するすべてのコントロールを無効にすることができます。次に、ボタンと親コンテナーを有効にする必要があります。
private void Form1_Load(object sender, EventArgs e) {
DisableControls(this);
EnableControls(Button1);
}
private void DisableControls(Control con) {
foreach (Control c in con.Controls) {
DisableControls(c);
}
con.Enabled = false;
}
private void EnableControls(Control con) {
if (con != null) {
con.Enabled = true;
EnableControls(con.Parent);
}
}
@pinkfloydx33の回答とそれに対する編集に基づいて、さらに簡単にする拡張メソッドを作成しました。次のpublic static class
ように作成するだけです:
public static class GuiExtensionMethods
{
public static void Enable(this Control con, bool enable)
{
if (con != null)
{
foreach (Control c in con.Controls)
{
c.Enable(enable);
}
try
{
con.Invoke((MethodInvoker)(() => con.Enabled = enable));
}
catch
{
}
}
}
}
ここで、コントロール、フォーム、メニュー、サブコントロールなどを有効または無効にするには、次のようにします。
this.Enable(true); //Will enable all the controls and sub controls for this form
this.Enable(false);//Will disable all the controls and sub controls for this form
Button1.Enable(true); //Will enable only the Button1
それで、@ pinkfloydx33の答えと同様に、私は何をしますか:
private void Form1_Load(object sender, EventArgs e)
{
this.Enable(false);
Button1.Enable(true);
}
拡張メソッドは静的であり、(手動で) インスタンスを作成しなくてもどこでも使用できるため、私は拡張メソッドが好きです。少なくとも私にとってははるかに明確です。
より優れた、より洗練されたソリューションを維持しやすくするには、ボタンを他のコントロールから離すなど、おそらくデザインを再考する必要があります。次に、他のコントロールがパネルまたはグループボックスにあると仮定して、単にPanel.Enabled = False
.
現在の設計を本当に維持したい場合は、再帰を避けるために ControlCollection ツリーを Control の配列に線形化し、次の操作を実行できます。
Array.ForEach(Me.Controls.GetAllControlsOfType(Of Control), Sub(x As Control) x.Enabled = False)
yourButton.Enabled = True