在哪种情况下,当最初加载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来返回自定义控件的父窗体(即使它放在另一个容器控件中)。
答案 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
不会为空。
我不确定这是否是您正在寻找的,如果不是,请不要犹豫,为您的问题添加更多背景信息。
干杯