16

私のフォームには、メニュー、パネル、スプリッター、ラベル、テキストボックスなど、何百ものコントロールがあります。

1つのボタンを除くすべてのコントロールを無効にする方法はありますか?

ボタンが重要である理由は、1つのコントロールがまだ使用可能である必要があるため、ウィンドウなどを無効にするメソッドを使用できないためです。

4

5 に答える 5

31

再帰呼び出しを実行して、関連するすべてのコントロールを無効にすることができます。次に、ボタンと親コンテナーを有効にする必要があります。

 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);
        }
    }
于 2012-11-19T00:41:13.067 に答える
14

@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);
}

拡張メソッドは静的であり、(手動で) インスタンスを作成しなくてもどこでも使用できるため、私は拡張メソッドが好きです。少なくとも私にとってははるかに明確です。

于 2014-05-14T10:27:35.597 に答える
8

より優れた、より洗練されたソリューションを維持しやすくするには、ボタンを他のコントロールから離すなど、おそらくデザインを再考する必要があります。次に、他のコントロールがパネルまたはグループボックスにあると仮定して、単にPanel.Enabled = False.

現在の設計を本当に維持したい場合は、再帰を避けるために ControlCollection ツリーを Control の配列に線形化し、次の操作を実行できます。

Array.ForEach(Me.Controls.GetAllControlsOfType(Of Control), Sub(x As Control) x.Enabled = False)
yourButton.Enabled = True
于 2012-11-19T00:56:51.867 に答える