在设计时获取当前窗体的所有控件
本文关键字:窗体 控件 获取 | 更新日期: 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属性。
在这里看了这个讨论之后,我终于意识到,通过在设计时访问任何控件属性,我可以使用属性窗口顶部的下拉菜单来定位控件名称。选择名称将显示控件在表单上的位置,并在属性编辑器中公开其属性。