获取组件的父表单

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.

  • 它在运行时如何工作。据我所知,是提供IDesignerHost实现的设计器,因此它只能在设计模式下工作。 (2认同)

Rob*_*use 9

我使用递归调用来走控制链.将其添加到您的控件.

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属性中使用它而不是这个.

  • 您还可以使用Control.FindForm()来实现此目的. (11认同)