Pon*_*dum 25 c# vb.net components winforms
我有一个非可视组件来管理其他视觉控件.
我需要引用组件正在运行的表单,但我不知道如何获取它.
我不确定添加一个构造函数与父指定为控件,因为我希望组件只是被放入设计器中工作.
另一个想法是让父母的财产作为控制,默认值为'我'
任何建议都会很棒
编辑:
为了澄清,这是一个组件,而不是一个控件,请参见此处:ComponentModel.Component
Joe*_*Joe 27
[重要的是要了解下面的ISite技术仅适用于设计时.因为ContainerControl是公共的并且被赋值,所以VisualStudio将编写在运行时设置它的初始化代码.站点在运行时设置,但你不能从它获取ContainerControl]
基本上,您需要向组件添加属性ContainerControl:
public ContainerControl ContainerControl
{
get { return _containerControl; }
set { _containerControl = value; }
}
private ContainerControl _containerControl = null;
Run Code Online (Sandbox Code Playgroud)
并覆盖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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果这样做,ContainerControl将被初始化为由设计者引用包含的表单.链接的文章更详细地解释了它.
查看如何执行操作的好方法是查看.NET Framework中的类型的实现,这些类型的行为与Lutz Reflector等工具类似.在这种情况下,System.Windows.Forms.ErrorProvider是一个很好的例子:一个需要知道其包含Form的Component.
我使用递归调用来走控制链.将其添加到您的控件.
public Form ParentForm
{
get { return GetParentForm( this.Parent ); }
}
private Form GetParentForm( Control parent )
{
Form form = parent as Form;
if ( form != null )
{
return form;
}
if ( parent != null )
{
// Walk up the control hierarchy
return GetParentForm( parent.Parent );
}
return null; // Control is not on a Form
}
Run Code Online (Sandbox Code Playgroud)
编辑:我看到你在输入时修改了你的问题.如果它是一个组件,那个组件的构造函数应该将它的父元素作为参数,父元素应该在构造时传入它.其他几个组件也会这样做,例如计时器.
将父控件保存为成员,然后在我上面给出的ParentForm属性中使用它而不是这个.