在设计时获取当前窗体的所有控件

本文关键字:窗体 控件 获取 | 更新日期: 2023-09-27 17:52:13

我有一个关于设计时的问题:

我制作了一个属性为"Links"的组件。这些链接是控件。现在我想制作一个ui对话框(用于在属性网格中编辑此属性)。

如何获得当前表单的所有控件?我认为组件与它有联系,但是在哪里呢?我找不到任何东西。

谢谢:)

在设计时获取当前窗体的所有控件

要获取当前表单的所有控件,然后使用以下代码获取该表单上的所有控件的集合:

MyForm.Controls

查看此MSDN帮助

编辑:

也许这些会有帮助?

控件集合的设计时编辑器支持

http://social.msdn.microsoft.com/forums/en us/winformsdesigner/thread/64df27e7 - 8502 - 42 - ac - 8634 cf8a8937d922/

在自定义/usercontrol (Winforms)中添加嵌套容器的设计时支持

这是非常重要的,我不知道有任何。net组件这样做的例子。您可以在设计时使用Site属性访问表单,但存在问题。难以处理的是用户删除控件,这些控件是您已经添加到控件集合中的控件。除了必须为表单或用户控件使用自定义设计器之外,我不知道还有什么好的触发器可以保持集合有效。

有一个更好的捕鼠器,你可以看到它被HelpProvider和ErrorProvider组件使用。注意它们是如何向窗体上的所有其他控件添加属性的。这是通过实现IExtenderProvider接口来完成的。在MSDN库文章中有一个很好的例子。

您可以在设计时获得IDesignerHost服务。该服务有一个名为Container的属性,其中包含Components。然后为每个组件获取INestedContainer服务,然后从该服务获取所有组件。

这就是文档大纲窗口的工作原理。我已经改变了他们的方法,使用List<IComponent>作为返回值:

List<IComponent> GetSelectableComponents(IDesignerHost host)
{
    var components = host.Container.Components;
    var list = new List<IComponent>();
    foreach (IComponent c in components)
        list.Add(c);
    for (var i = 0; i < list.Count; ++i)
    {
        var component1 = list[i];
        if (component1.Site != null)
        {
            var service = (INestedContainer)component1.Site.GetService(
                typeof(INestedContainer));
            if (service != null && service.Components.Count > 0)
            {
                foreach (IComponent component2 in service.Components)
                {
                    if (!list.Contains(component2))
                        list.Add(component2);
                }
            }
        }
    }
    return list;
}

要过滤结果以只包含控件,可以调用result.TypeOf<Control>() .

不确定这是不是你想要的。

我"丢失"了一个标签控件,因为我不小心删除了它的text属性。

在这里看了这个讨论之后,我终于意识到,通过在设计时访问任何控件属性,我可以使用属性窗口顶部的下拉菜单来定位控件名称。选择名称将显示控件在表单上的位置,并在属性编辑器中公开其属性。