2011-08-24 19 views
5

現在、フォームのコントロールのほとんどは、ファイルがロードされるまで使用できないため、起動時に無効になっています。ただし、ファイルが読み込まれると、コントロールが有効になります。フォームのすべてのコントロールを有効にする方法は?

私はバインディングを使用していましたが、良い解決策ではないと思います。 1つは、不要な複雑さです。第二に、すべてにバインディングを使用することはできません。たとえば、MenuStripアイテムのEnabledプロパティをfileLoadedプロパティにバインドすることはできません。メニュー全体だけが実行でき、起動時にメニュー全体を無効にしたくない場合は、そのファイルに対して操作する特定のメニュー操作のみを無効にします。

私は本当にすべてを有効にする方法を探しています。 (パネルまたはカスタムコントロールのように)他のコントロール内MenuStrip項目またはコントロールを可能とするために動作しないこと、しかし

foreach (Control c in Controls) 
{ 
    c.Enabled = true; 
} 

:ほとんどは、ときに、このと答えるだろうと尋ねました。したがって、コンテナ内のスクロールバーは有効になりません。

私はその行を使用して手動で他のものを有効にすることができますが、常にを手に入れることができると思います。はすべて有効になっています。私は自動的にすべてを有効にする方法を探しています。

+0

をこれらの要素は、最初の場所で無効にした方法は?おそらく、リスト内で何が無効になっているのかを追跡し、そのリストからすべての要素を再度有効にする(そしてクリアする)ことができます。 –

+0

フォームデザイナで無効になっています。ほとんどのアプリケーションのツールは、ロードされたファイルなしでは使用できないため、デフォルトでは無効になっています。 –

答えて

11

再帰

private void enableControls(Control.ControlCollection Controls) 
{ 
    foreach (Control c in Controls) 
    { 
     c.Enabled = true; 
     if (c is MenuStrip) 
     { 
      foreach(var item in ((MenuStrip)c).Items) 
      { 
       item.Enabled = true; 
      } 
     } 
     if (c.ControlCollection.Count > 0) 
      enableControls(c.Controls); 

    } 
} 

を編集

がコントロールコレクションがカウントチェックの代わりにWebBrowserコントロール

+0

ありがとう、これはうまくいきます。ただし、MenuStripアイテムはまだ有効になっていません。手動で有効にできると思いますが、このループに含める方法があるのだろうかと思います。 –

+0

私はそれを行うことができました – msarchet

+0

@ JohnSmith menustripの編集を確認してください – msarchet

2

これを行います。

var Enable = (Control c) => 
      { 
       c.Enabled = true; 
       if(c.Controls != null) 
        foreach(Control c2 in c.Controls) 
         Enable(c2); 
      } 

Enable(YourForm); 
+0

これは1レベル下がります – msarchet

+0

@msarchet:いいえ、その再帰的な – Dani

+0

はコールバックを逃して、それをc2.enable – msarchet

1

が再帰的に反復処理されHasControlsされている必要がありますあなたのメニューは、メニュー内のすべての項目を無効にするために必要です。ただし、すべてのフォームコントロールには、フォーム全体にまたがるパネルに埋め込み、VS Designerでフォームを無効にするという簡単なソリューションがあります。ユーザーがファイルを選択すると、パネルとビオラを有効にします!余分な再帰(またはオーバーヘッド)は必要ありません。

再帰的なルートにしたい場合は、最初にChangeEnabledStateに名前を変更してEnableメソッドを変更し、次にEnabledプロパティに割り当てるためのboolパラメータを設定します。これにより、必要に応じてコントロールを有効/無効にすることができます。ただし、コントロールがボタンであるかどうか(またはOpenFileDialogを開くために使用しているコントロール)がディスエーブル操作でスキップされるかどうかをチェックする必要があります。

6

すべてのコントロールをパネルに配置します。パネル内のすべてのコントロールが無効になります。 panel.enable = true - >パネル内のすべてのコントロールが有効になります(デフォルトで有効になっている場合、すぐに有効なコントロールでパネルを塗りつぶします)。パネルを有効にした後、コントロールが有効になります)

+0

+1、それは私がやることです。 – TheBlastOne

3

menustripアイテムの場合、再帰的に行うことができますが、非常に簡単です。 item.Enabledフラグをtrueまたはfalseに設定するだけです。

私のクラスを使用することができます。これは数行のコードで使いやすいです。検索機能を作成し、無効にしたい名前を渡すこともできます。 お楽しみ:あなたのアプリで

namespace Test_MenuItemIteration 
{ 
    using System.Collections.Generic; 
    using System.Windows.Forms; 

    public static class GetAllMenuStripItems 
    { 
     #region Methods 

     /// <summary> 
     /// Gets a list of all ToolStripMenuItems 
     /// </summary> 
     /// <param name="menuStrip">The menu strip control</param> 
     /// <returns>List of all ToolStripMenuItems</returns> 
     public static List<ToolStripMenuItem> GetItems(MenuStrip menuStrip) 
     { 
      List<ToolStripMenuItem> myItems = new List<ToolStripMenuItem>(); 
      foreach (ToolStripMenuItem i in menuStrip.Items) 
      { 
       GetMenuItems(i, myItems); 
      } 
      return myItems; 
     } 

     /// <summary> 
     /// Gets the menu items. 
     /// </summary> 
     /// <param name="item">The item.</param> 
     /// <param name="items">The items.</param> 
     private static void GetMenuItems(ToolStripMenuItem item, List<ToolStripMenuItem> items) 
     { 
      items.Add(item); 
      foreach (ToolStripItem i in item.DropDownItems) 
      { 
       if (i is ToolStripMenuItem) 
       { 
        GetMenuItems((ToolStripMenuItem)i, items); 
       } 
      } 
     } 

     #endregion Methods 
    } 
} 

用途:

List<ToolStripMenuItem> myItems = GetAllMenuStripItems.GetItems(this.menuStrip1); 
foreach (var item in myItems) 
{ 
    MessageBox.Show(item.Text); 
    item.Enabled = false; 
} 
関連する問題