如何可靠地引用包含的表格

时间:2014-02-08 00:51:38

标签: .net winforms custom-controls

在哪种情况下,当最初加载WinForms自定义控件(继承自TextBox)时,是否可以并且适当地可靠地引用父窗体?

经过搜索,我发现一个涵盖此区域的讨论是.NET WinForms Custom Control: how to get a reference to the containing form。具体来说,adrift的发布涉及到将自定义控件添加到父表单(并且OnParentChanged事件触发)之前的问题,FindForm将返回null。

基于此,建议使用OnParentChanged事件。不幸的是,我发现如果自定义控件包含在另一个控件(例如Panel)中,则此容器不一定会添加到窗体的控件集合中,即使在自定义控件的OnParentChanged事件中,FindForm也将返回null。 / p>

因此,我想知道是否有更好的事件可以使用FindForm来返回自定义控件的父窗体(即使它放在另一个容器控件中)。

1 个答案:

答案 0 :(得分:1)

根据我对您的问题的理解,您可以在自定义控件上实现ISupportInitialize接口。

这将允许您的控件代码由Form的InitializeComponent()方法调用。

例如,这个简单的用户控件来自Button:

class MyButton : Button, ISupportInitialize
{
    public void BeginInit()
    {
        var parent = this.TopLevelControl;
    }

    public void EndInit()
    {
        var parent = this.TopLevelControl;
    }
}

当放置在Form上时,设计器代码将如下所示:

private void InitializeComponent()
{
    this.myButton1 = new Quartz1.MyButton();
    ((System.ComponentModel.ISupportInitialize)(this.myButton1)).BeginInit();
    this.SuspendLayout();
    // 
    // myButton1
    // 
    this.myButton1.Location = new System.Drawing.Point(371, 338);
    this.myButton1.Name = "myButton1";
    this.myButton1.Size = new System.Drawing.Size(75, 23);
    this.myButton1.TabIndex = 4;
    this.myButton1.Text = "myButton1";
    this.myButton1.UseVisualStyleBackColor = true;
    // 
    // Form1
    // 
    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    this.ClientSize = new System.Drawing.Size(1012, 440);
    this.Controls.Add(this.myButton1);
    this.Name = "Form1";
    this.Text = "Form1";
    ((System.ComponentModel.ISupportInitialize)(this.myButton1)).EndInit();
    this.ResumeLayout(false);
    this.PerformLayout();
}

如您所见,表单初始化完成后,将在控件上调用EndInit()。此时this.TopLevelControl不会为空。

我不确定这是否是您正在寻找的,如果不是,请不要犹豫,为您的问题添加更多背景信息。

干杯