我需要操作表单上的所有控件。我可以访问Controls集合来执行此操作。问题在于尝试包含容器控件中包含的任何控件,例如GroupBox
或Panel
。我可以递归迭代每个Control自己的Controls集合,但这会访问非设计时容器的所有组成控件。
由于我的非容器控件都根据自己的属性管理其组成控件的状态,所以我不会开始搞乱组成控件。
如何确定控件是否是设计时容器,以便我可以避免处理那些不是?
我已尝试检查Designer属性,但这会为ComboBox
和GroupBox
返回null:
foreach(Attribute attr in typeof(ctl).GetCustomAttributes(typeof(Attribute), false))
{
if(typeof(DesignerAttribute).IsAssignableFrom(attr.GetType()))
{
DesignerAttribute da = (DesignerAttribute)attr;
}
}
ctl
的类型为Control
,我的测试结果为Combox
或GroupBox
。
在这两种情况下,GetCustomAttributes
都会返回一个1属性数组,即工具箱图标。
我也尝试检查从ContainerControl
类的可分配性,但它们都是因为我认为它们都会在运行时包含控件。
如何检测设计时容器?
答案 0 :(得分:1)
如果Hans没有回来,而且任何人都感兴趣,这是我根据Hans Passant的建议解决问题的方法:
public static bool IsContainerControl(this Control ctl)
{
if (ctl == null)
return false;
MethodInfo GetStyle = ctl.GetType().GetMethod("GetStyle", BindingFlags.NonPublic | BindingFlags.Instance);
if (GetStyle == null)
return false;
return (bool)GetStyle.Invoke(ctl, new object[] { ControlStyles.ContainerControl });
}