我有一个.NET控件,用户可以将其放在表单上。
Visual Studio创建一个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流媒体系统调用Loaded 控件的表单加载到内存后自动执行 控件可以完成依赖于其他的任何初始化 表格中的对象。
答案 0 :(得分:2)
实施ISupportInitialize
界面。 Visual Studio将在完成设置所有组件属性后调用EndInit
的表单设计器代码文件中添加代码。
答案 1 :(得分:1)
假设您询问WinForms Control
类:您可以覆盖Control.OnControlCreated
方法。另一个选项是覆盖在创建基础图形对象时调用的Control.OnHandleCreated
方法。
答案 2 :(得分:0)
而且......你可以在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
}
答案 3 :(得分:0)
假设您希望在Control
“准备就绪”时执行一些代码:
如果您希望在Control
“准备就绪”时立即执行,即使在显示表单之前:在表单的构造函数中的InitializeComponent();
之后添加该代码。 (这只是一种创建Control
等的方法。)
如果您希望在显示表单时执行,请添加:
Shown += Form1_Shown;
在表单的构造函数中,并且:
void Form1_Shown(object sender, EventArgs e)
{
//code to execute.
}
在表格的类中。