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

C# 在运行时确定控件是否允许在设计时向其添加其他控件,c#,controls,containers,design-time,C#,Controls,Containers,Design Time,我需要操纵窗体上的所有控件。我可以访问Controls集合来执行此操作。试图包含容器控件(如GroupBox或Panel)中包含的任何控件都会出现问题。我可以递归地迭代每个控件自己的控件集合,但这会访问非设计时容器的所有组成控件 因为我的非容器控件都是基于它们自己的属性来管理它们的组成控件的状态,所以我不想开始处理组成控件 如何确定控件是否是设计时容器,从而避免处理那些不是设计时容器的控件 我已尝试检查Designer属性,但对于ComboBox和GroupBox,这都会返回null: fore

我需要操纵窗体上的所有控件。我可以访问Controls集合来执行此操作。试图包含容器控件(如
GroupBox
Panel
)中包含的任何控件都会出现问题。我可以递归地迭代每个控件自己的控件集合,但这会访问非设计时容器的所有组成控件

因为我的非容器控件都是基于它们自己的属性来管理它们的组成控件的状态,所以我不想开始处理组成控件

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

我已尝试检查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
类的可分配性,但它们都是因为,我假设,它们都将在运行时包含控件


如何检测设计时容器?

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

哪个控件包含您不想要的其他控件?我只知道一个-
PropertyGrid
,很容易从递归中排除它。任何复合用户控件。我不能明确地测试所有的可能性。
UserControl
?把他们全部排除在外!那么作为设计时容器的用户控件呢?有吗?子类
面板
不是
UserControl
。我觉得不错。请把你的帖子标记为答案来结束你的问题。是的,我还不能。我这样做有一些愚蠢的48小时限制。我要求你发布一个我愿意接受的答案的原因是,据我所知,这个网站根据用户答案的质量给他们打分。你肯定应该为我指出正确的方向而得到表扬。我已经被评分了,看起来你会比我有更多的用处:)哈哈,你有。它在评论中没有显示出声誉。这些都是大数字