我有一个关于设计时的事情的问题:
我做了与财产“链接”的组成部分。这些链接是对照。现在我想打一个UI的对话框(编辑属性网格中该属性)。
我怎样才能得到当前形式的所有控件?我认为组件有它的连接,但在哪里?我无法找到任何东西。
谢谢 :)
这是相当untrivial做的,我不知道那做到这一点.NET组件的任何实例。你可以在设计时与本网站财产的形式,但有问题。什么是很难处理的是删除控件,您已经添加到您的控件集合那些用户。我不知道有什么好触发器,以保持您的收藏有效,也超越不必使用自定义设计的窗体或用户控件。
有这个一个更好的捕鼠器,你看到它正在使用的例如HelpProvider和ErrorProvider控件组件。注意他们是如何将属性添加到所有其他控件的形式。这是由实现IExtenderProvider接口完成。有这样的MSDN library article一个很好的例子。
要获取所有当前表单的控件,然后使用下面的代码来获取所有窗体上的控件的集合:
MyForm.Controls
编辑:
也许这些会帮助?
Design-time editor support for controls collection
Adding design-time support for a nested container in a custom/usercontrol (Winforms)
您可以在设计时得到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属性“丢失”的标签控制。
看着这里的讨论之后,我终于明白了,在设计时访问任何控件的属性,我可以使用下拉 - 向下在属性窗口的顶部,找到控制的名字。选择名称显示窗体上的控件的位置,并露出它的属性编辑器的属性。