【问题标题】:Determine at run time if a control allows other controls to be added to it at design time在运行时确定控件是否允许在设计时向其添加其他控件
【发布时间】:2014-03-09 09:50:43
【问题描述】:

我需要操作表单上的所有控件。我可以访问 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;
    }
}

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

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

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

如何检测设计时容器?

【问题讨论】:

  • 哪个控件包含您不想要的其他控件?我只知道一个 - PropertyGrid,并且很容易将它排除从递归中。
  • 任何复合用户控件。我无法明确测试所有可能性。
  • UserControl 仅?排除所有这些!
  • 那么作为设计时容器的用户控件呢?
  • 有吗?子类化 Panel 不是 UserControl

标签: c# controls containers design-time


【解决方案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 });
    }

【讨论】:

  • 我觉得不错。请通过将您的帖子标记为答案来结束您的问题。
  • 是的,我还不能。我这样做有一些愚蠢的 48 小时限制。
  • 我要求您发布我会接受的答案的原因是,据我了解,该网站根据用户的回答质量对其用户进行评分。你一定会因为为我指明正确的方向而受到称赞。
  • 我已经被评分了,在我看来你会比我有更多的用处:)
  • 大声笑,所以你有。它不会在 cmets 上显示声誉。这些都是很大的数字。 :)
猜你喜欢
  • 2012-05-03
  • 1970-01-01
  • 2016-12-26
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多