.net 如何知道控件何时完成初始化?
我有一个.NET控件,用户可以将它放到窗体上 Visual Studio创建一个.net 如何知道控件何时完成初始化?,.net,winforms,controls,.net,Winforms,Controls,我有一个.NET控件,用户可以将它放到窗体上 Visual Studio创建一个InitializeComponent,该组件从宿主窗体的构造函数调用: public EditItemForm() { InitializeComponent(); } 这个自动生成的方法在自动生成的文件中,根据设计器序列化规则初始化我的控件。e、 g: private void InitializeComponent() { ... this.lvResults = new Contoso.C
InitializeComponent
,该组件从宿主窗体的构造函数调用:
public EditItemForm()
{
InitializeComponent();
}
这个自动生成的方法在自动生成的文件中,根据设计器序列化规则初始化我的控件。e、 g:
private void InitializeComponent()
{
...
this.lvResults = new Contoso.Controls.VirtualGrobber();
...
//
// lvResults
//
this.lvResults.BorderStyle = System.Windows.Forms.BorderStyle.None;
...
//FrobGrobberForm
...
this.Controls.Add(this.lvResults);
...
}
我,一个坐在某人窗体上的控件,如何知道所有设计器序列化何时完成,我是否“准备就绪”
在Delphi中,在控件中序列化的机制会自动调用每个控件的
Loaded
方法:
从流加载控件后初始化该控件
procedure Loaded; override;
说明
VCL流媒体系统调用已加载
控件的窗体加载到内存后自动执行,以便
控件可以完成依赖于其他控件的任何初始化
窗体中的对象
假设您询问WinForms
控件
类:您可以重写该方法。另一个选项是重写在创建基础图形对象时调用的方法。并且。。。您可以在ParentChanged
事件中检测到它
private void VirtualGrobber_ParentChanged(object sender, EventArgs e)
{
try
{
Form frm = this.FindForm();
if (frm != null && !frm.IsDisposed)
frm.Load += new EventHandler(frm_Load);
}
catch (Exception ex)
{
//Do something
}
}
private void frm_Load(object sender, EventArgs e)
{
//Do what you want
}
假设您希望在
控件
处于“就绪”状态时执行一些代码:
如果希望在控件
处于“就绪”状态时立即执行,甚至在显示表单之前:在InitializeComponent()之后添加该代码代码>在窗体的构造函数中。(这只是一种创建控件等的方法。)
如果要在显示表单时执行,请添加:
Shown += Form1_Shown;
在表单的构造函数中,以及:
void Form1_Shown(object sender, EventArgs e)
{
//code to execute.
}
在窗体的类中。实现接口。Visual Studio将向表单设计器代码文件添加代码,设置完所有组件的属性后,表单设计器代码文件将调用该代码。可以使用多种不同的方法来执行此操作。哪一个是惯用的或合适的取决于您试图初始化的内容。当然,设计器并没有做任何神奇的事情,它只是在控件上设置属性。设计自定义控件的标准规则是,属性应该能够以任何顺序设置,无论是由用户还是由设计器设置。实现ISupportInitialize接口。@HansPassant我实现了ISupportInitialize,并将代码放入EndInit(),但从未调用过它。实施ISupportInitialize应该做些什么吗?我收回。构建两次后,设计器将在初始化组件期间添加对EndInit()
的调用。我真的应该以答案的形式表达出来。