在运行时确定控件是否允许在设计时向其添加其他控件



我需要操作表单上的所有控件。我可以访问controls集合来完成这项工作。尝试包含容器控件(如GroupBoxPanel)中包含的任何控件时会出现问题。我可以递归地迭代每个控件自己的Controls集合,但这会访问非设计时容器的所有组成控件。

由于我的非容器控件都基于它们自己的属性来管理它们的组成控件的状态,所以我不想开始扰乱组成控件。

如何确定控件是否是设计时容器,以便避免处理那些不是的控件?

我已经尝试检查Designer属性,但对于ComboBoxGroupBox:都返回null

foreach(Attribute attr in typeof(ctl).GetCustomAttributes(typeof(Attribute), false))
{
if(typeof(DesignerAttribute).IsAssignableFrom(attr.GetType()))
{
DesignerAttribute da = (DesignerAttribute)attr;
}
}

ctlControl类型,在我的测试中是ComboxGroupBox

在这两种情况下,GetCustomAttributes都返回一个包含1个属性的数组,该属性是工具箱图标。

我也尝试过检查从到ContainerControl类的可分配性,但它们都是,因为我认为它们在运行时都包含控件。

如何检测设计时容器?

如果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 });
}

最新更新