如何在C#中从运行时获取表单中的所有控件?

时间:2009-11-30 14:51:20

标签: c# .net winforms

是否有一种简单的方法可以获取包含属性".Text"的所有控件?

我可以获取所有"top level"个控件,但我的代码在所有级别上找不到像menu items这样的子控件等。我也尝试了"ctrl.HasChildren"

如何在运行时在Windows窗体中执行此操作?

4 个答案:

答案 0 :(得分:7)

从Control派生的每个控件都有一个Text属性,它是每个控件 - 但是对于某些控件,这个属性没有意义。

构建完整的控件列表,您需要迭代Form的Controls集合,然后,对于其中的每个控件,递归迭代该控件的Controls集合。

IList<Control> controlsOnForm = new List<Control>();
BuildControlsList(this.Controls, controlsOnForm);

private static void BuildControlsList(ControlCollection controls, IList<Control> listToPopulate)
{
    foreach (Control childControl in controls)
    {
        listToPopulate.Add(childControl);
        BuildControlsList(childControl.Controls, listToPopulate);
    }
}

我实际上并不确定如何区分具有有用Text属性的控件和未使用它的控件。显然,一种方法是排除那些Text属性为空字符串的控件。

也可以为菜单执行类似操作(请注意,如果使用MainMenuStrip,则需要稍微修改一下):

IList<Menu> menusOnForm = new List<Menu>();
if (this.Menu != null)
{
    menusOnForm.Add(this.Menu);
    BuildMenuList(this.Menu.MenuItems, menusOnForm);
}

private static void BuildMenusList(MenuItemCollection menuItems, IList<Menu> listToPopulate)
{
    foreach (Menu menuItem in menuItems)
    {
        listToPopulate.Add(menuItem);
        BuildMenusList(menuItem.MenuItems, listToPopulate);
    }
}

答案 1 :(得分:3)

您可以遍历每个控件并使用反射来查找属性Name Text

     foreach (Control contrl in this.Controls)
     {
        if (contrl.GetType().GetProperty("Text") != null)
        {
           // contrl has Text Property
        }
     }

添加搜索所有控件

  List<Control> text_controls = new List<Control>();
  FindAllControls(this.Controls, text_controls);

  private void FindAllControls(Control.ControlCollection controls, List<Control> ctrlsWithTextProperty)
  {
     foreach(Control ctrl in controls)
     {
        if(ctrl.GetType().GetProperty("Text") != null)
        {
           ctrlsWithTextProperty.Add(ctrl);
        }
        if (ctrl.Controls != null)
        {
           FindAllControls(ctrl.Controls, ctrlsWithTextProperty);
        }
     }
  }

答案 2 :(得分:1)

你应该可以检查

if(control.Controls.Count > 0)

然后,您可以递归调用方法来循环控制树。

答案 3 :(得分:0)

递归可能是一个解决方案,有一个函数接受一个控件并返回它的所有子节点(它在所有子节点上调用它自己)。

这样你就可以获得一系列控件。