获取当前形式的所有控件在设计时

问题描述 投票:1回答:4

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

我做了与财产“链接”的组成部分。这些链接是对照。现在我想打一个UI的对话框(编辑属性网格中该属性)。

我怎样才能得到当前形式的所有控件?我认为组件有它的连接,但在哪里?我无法找到任何东西。

谢谢 :)

c# .net winforms windows-forms-designer design-time
4个回答
1
投票

这是相当untrivial做的,我不知道那做到这一点.NET组件的任何实例。你可以在设计时与本网站财产的形式,但有问题。什么是很难处理的是删除控件,您已经添加到您的控件集合那些用户。我不知道有什么好触发器,以保持您的收藏有效,也超越不必使用自定义设计的窗体或用户控件。

有这个一个更好的捕鼠器,你看到它正在使用的例如HelpProvider和ErrorProvider控件组件。注意他们是如何将属性添加到所有其他控件的形式。这是由实现IExtenderProvider接口完成。有这样的MSDN library article一个很好的例子。


2
投票

0
投票

您可以在设计时得到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>()


-1
投票

不知道这是否是你想要的。

我意外地删除它的Text属性“丢失”的标签控制。

看着这里的讨论之后,我终于明白了,在设计时访问任何控件的属性,我可以使用下拉 - 向下在属性窗口的顶部,找到控制的名字。选择名称显示窗体上的控件的位置,并露出它的属性编辑器的属性。

© www.soinside.com 2019 - 2024. All rights reserved.