我有一个管理其他可视控件的非可视组件。
我需要引用组件正在运行的表单,但我不知道如何获取它。
我不确定添加一个将父级指定为控件的构造函数,因为我希望组件只需放入设计器中即可工作。
我的另一个想法是将父属性作为控件,默认值为“我”
任何建议都很好
编辑:
澄清一下,这是一个组件,而不是控件,请参见此处:ComponentModel.Component
最佳答案
[重要的是要了解以下 ISite 技术仅在设计时有效。因为 ContainerControl 是公共(public)的并且被分配了一个值,所以 VisualStudio 将编写在运行时设置它的初始化代码。站点在运行时设置,但您无法从中获取 ContainerControl]
Here's an article描述了如何为非可视组件执行此操作。
基本上您需要向您的组件添加一个属性 ContainerControl:
public ContainerControl ContainerControl
{
get { return _containerControl; }
set { _containerControl = value; }
}
private ContainerControl _containerControl = null;
并覆盖 Site 属性:
public override ISite Site
{
get { return base.Site; }
set
{
base.Site = value;
if (value == null)
{
return;
}
IDesignerHost host = value.GetService(
typeof(IDesignerHost)) as IDesignerHost;
if (host != null)
{
IComponent componentHost = host.RootComponent;
if (componentHost is ContainerControl)
{
ContainerControl = componentHost as ContainerControl;
}
}
}
}
如果您这样做,ContainerControl 将被初始化为由设计者引用包含表单。链接的文章对其进行了更详细的解释。
了解如何做事的一个好方法是查看 .NET Framework 中类型的实现,这些类型的行为与您使用 Lutz Reflector 等工具想要的行为相似。在这种情况下,System.Windows.Forms.ErrorProvider 是一个很好的例子:一个需要知道其包含表单的组件。
关于c# - 获取组件的父表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/371464/