c# - 获取组件的父表单

标签 c# vb.net winforms components

我有一个管理其他可视控件的非可视组件。

我需要引用组件正在运行的表单,但我不知道如何获取它。

我不确定添加一个将父级指定为控件的构造函数,因为我希望组件只需放入设计器中即可工作。

我的另一个想法是将父属性作为控件,默认值为“我”

任何建议都很好

编辑:

澄清一下,这是一个组件,而不是控件,请参见此处: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/

相关文章:

vb.net - 如何将经度和纬度转换为 GPS Exif 字节数组

c# - 如果当前行宽已满,WinForm 换行

c# - 使用户控件显示在窗体边界之外

c# - 仅当@variable 为空时才选择联合,使用 SQL 存储过程

c# - JSON.NET 序列化日期

.net - 字符串不等于字符串?

excel - VB .NET 中的 CDbl 和小数分隔符 - 有没有办法绕过区域设置?

c# - 如何通过同步实现 C# Winforms 数据库应用程序?

c# - Entity Framework 代码首先使用额外的键进行多对多

c# - 用于连接互联网的分布式 C# 客户端的消息队列解决方案