是否有一种简单的方法可以获取包含属性".Text"
的所有控件?
我可以获取所有"top level"
个控件,但我的代码在所有级别上找不到像menu items
这样的子控件等。我也尝试了"ctrl.HasChildren"
。
如何在运行时在Windows窗体中执行此操作?
答案 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)
递归可能是一个解决方案,有一个函数接受一个控件并返回它的所有子节点(它在所有子节点上调用它自己)。
这样你就可以获得一系列控件。