2011-08-24 42 views
5

目前,我的表单控件大多数在启动时都处于禁​​用状态,因为在加载文件之前您无法使用它们。但是,一旦文件被加载,控件应该被启用。如何启用窗体上的所有控件?

我正在使用绑定,但我不认为他们是一个很好的解决方案。首先,这是不必要的复杂性。其次,你不能使用绑定的一切。例如,MenuStrip项目不能将其Enabled属性绑定到fileLoaded属性。只有整个菜单可以,我不想在启动时禁用整个菜单,只有在文件上操作的某些菜单操作。

我真的只是寻找一种方式来启用一切。当被问及最会用这样的回答:

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

然而,这并不启用其它控件中的MenuStrip项或控制(如面板或自定义控制)工作。因此它不会启用容器中的滚动条。

我想我可以使用该行并手动启用一切,但我可​​以一直只用手动启用一切。我正在寻找一种方法来自动启用的一切

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

    } 
} 

编辑

本来应该检查控制集数,而不是HasControls哪家器WebControls

+0

谢谢,这很好。但是,它仍然不启用MenuStrip项目。我想我可以手动启用它们,但我想知道是否有办法将它们包含在这个循环中? –

+0

是的,我们可以这样做 – msarchet

+0

@JohnSmith检查菜单栏的编辑 – 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

递归遍历您的菜单有必要禁用菜单中的每个项目。但是,对于所有表单控件,都有一个更简单的解决方案 - 将它们嵌入跨越整个表单的面板中,并禁用VS Designer中的表单。当你的用户选择一个文件,启用面板和中提琴!不需要额外的递归(或开销)。

如果你仍然想要去递归路线,我会改变启用方法,首先将其重命名为ChangeEnabledState,第二,我会设置一个布尔参数,允许您使用该参数分配到Enabled属性。这样可以根据需要启用/禁用控件。但是,请记住,您需要添加一个检查来查看该控件是否是该按钮(或者您用来打开OpenFileDialog的控件)在禁用操作中被跳过。

6

将所有控件放在面板中;

panel.enable = false - >面板中的所有控件将被禁用 panel.enable = true - >将启用面板中的所有控件(如果它们处于默认启用状态,则很快用启用的控件填充面板,让你的面板关闭,这样你的控件也将被禁用。启用面板后,你的控件将被启用)

+0

+1,这就是我会做的。 – TheBlastOne

3

对于菜单项目,你可以递归地做到这一点,这很简单。 只需将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; 
} 
相关问题