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

C# 在设计时获取当前窗体的所有控件,c#,.net,winforms,windows-forms-designer,design-time,C#,.net,Winforms,Windows Forms Designer,Design Time,我有一个关于设计时的问题: 我制作了一个属性为“Links”的组件。 这些链接是控件。现在我想创建一个UI对话框(用于在属性网格中编辑此属性) 如何获取当前窗体的所有控件?我认为这个组件和它有联系,但是在哪里呢?我什么也找不到 谢谢:)要获取当前表单的所有控件,请使用以下代码获取该表单上所有控件的集合: MyForm.Controls 编辑: 也许这些会有帮助 这是非常不寻常的,我不知道有任何.NET组件可以做到这一点。您可以在设计时使用Site属性访问表单,但存在问题。很难处理的是用户删

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

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

如何获取当前窗体的所有控件?我认为这个组件和它有联系,但是在哪里呢?我什么也找不到


谢谢:)

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

MyForm.Controls

编辑:

也许这些会有帮助


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


有一个更好的捕鼠器用于此,例如,您可以看到HelpProvider和ErrorProvider组件正在使用它。请注意它们是如何将属性添加到窗体上的所有其他控件的。这是通过实现IExtenderProvider接口实现的。在中有一个很好的例子。

不确定这是否是您想要的

由于意外删除了label控件的text属性,我“丢失”了该控件

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

您可以在设计时获得服务。此服务有一个名为
容器
的属性,该属性包含
组件
。然后,对于每个组件,获取服务,然后从该服务获取所有组件

这就是“文档大纲”窗口的工作方式。我已将其方法更改为使用
List
作为返回值:

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;
}
列出GetSelectableComponents(IDesignerHost主机)
{
var components=host.Container.components;
var list=新列表();
foreach(组件中的IComponent c)
增加(c)项;
对于(变量i=0;i0)
{
foreach(服务中的IComponent组件2.Components)
{
如果(!list.Contains(component2))
列表。添加(组件2);
}
}
}
}
退货清单;
}

要过滤结果以仅包含控件,可以调用
result.TypeOf()

Hmm。。。是的,这很糟糕:-/我知道扩展器的属性。但它们并不是我真正想要做的,因为我需要分配另一个控件。。。嗯,也许我能找到解决办法。