2012-11-19 13 views
9

私のフォームには、メニュー、パネル、スプリッター、ラベル、テキストボックスなど、何百ものコントロールがあります。ボタン以外のフォームのすべてのコントロールを無効にする方法はありますか?

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

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

+1

ボタンを別のフォームに入れますか? – SLaks

+0

各フォームのEnabledプロパティを設定するだけで、フォームのすべてのコントロールをループすることはできませんか?ループでは、ID /名前を使用してボタンを無視します。または、ループ内のすべてを無効にしてからすぐにボタンを有効にします。 –

答えて

21

再帰呼び出しを実行して、関連するすべてのコントロールを無効にすることができます。次に、ボタンと親コンテナを有効にする必要があります。保守が容易になり、より良い、よりエレガントな解決策については、

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); 
     } 
    } 
+1

なぜrefキーワードをそこに含めますか? –

+0

私はしません。私はそれを入力して何らかの理由でそれはちょうど出てきた電話の上にあった – pinkfloydx33

+0

ハ。よくやった。私はあなたがどのように特定のコントロールを知らないか気にかけていない方法を作ったのが好きです。初心者はそのようなことを見落とす。 –

8

- あなたはおそらく他のコントロールとは別に、あなたのボタンを置くなど、あなたのデザインを再考する必要があります。次に、他のコントロールがパネルまたはグループボックス内にあると仮定して、ただPanel.Enabled = Falseを実行します。

あなたが本当にあなたの現在のデザインを維持したい場合は、することができますLinearise ControlCollection tree into array of Control再帰を避けるために、その後は、次の手順を実行します@のpinkfloydx33の答えと私はそれの上に作られた編集に基づいて

Array.ForEach(Me.Controls.GetAllControlsOfType(Of Control), Sub(x As Control) x.Enabled = False) 
yourButton.Enabled = True 
+1

+1はデザインを再考するために+1されます。 –

+0

+1 'Panel.Enabled = false | true'の場合+1です。インターフェイスを再設計してコントロールのグループを作成し、グループ全体を無効にすることは、確かにUIを設計するためのより良い方法です。 – sentenza

10

を、私は拡張機能を作成しましたなど

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 
       { 
       } 
      } 
     } 
} 

、コントロールを有効または無効にするには、フォーム、メニュー、サブコントロール、ジャスト実行します:それも容易になります方法、ちょうどこのようpublic static classを作成

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

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

+0

これは機能しません。 this.Enable(false)を呼び出した場合。 Button1.Enable(true)を呼び出すと、この(フォーム)とButton1の他の親コントロールはまだ無効です。 –

+0

おそらく私はあなたを理解していないが、それがポイントだと思う。 Button1の親を有効にしてください。必要な場合は、親とすべての子コントロールを有効にする必要があります。 – coloboxp

関連する問題