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

时间:2014-02-11 14:34:53

标签: c# controls containers design-time

我需要操作表单上的所有控件。我可以访问Controls集合来执行此操作。问题在于尝试包含容器控件中包含的任何控件,例如GroupBoxPanel。我可以递归迭代每个Control自己的Controls集合,但这会访问非设计时容器的所有组成控件。

由于我的非容器控件都根据自己的属性管理其组成控件的状态,所以我不会开始搞乱组成控件。

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

我已尝试检查Designer属性,但这会为ComboBoxGroupBox返回null:

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

ctl的类型为Control,我的测试结果为ComboxGroupBox

在这两种情况下,GetCustomAttributes都会返回一个1属性数组,即工具箱图标。

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

如何检测设计时容器?

1 个答案:

答案 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 });
    }