我如何知道我的控件何时完成初始化?

时间:2012-02-17 22:33:38

标签: .net winforms controls

我有一个.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   控件的表单加载到内存后自动执行   控件可以完成依赖于其他的任何初始化   表格中的对象。

4 个答案:

答案 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.
}

在表格的类中。