2012-02-17 59 views
1

我有一个用户可以放在窗体上的.NET控件。我如何知道当我的控制完成初始化?

Visual Studio创建一个InitializeComponent,这是从托管形式的构造函数调用:

public EditItemForm() 
{ 
    InitializeComponent(); 
} 

这种自动生成的方法,在一个自动生成的文件的基础上,设计师serializiblity规则初始化我的控制。例如: -

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的流媒体系统调用加载 控件的形式被加载到内存后自动使 控制可以完成这取决于形式与其他 对象的任何初始化。

+1

有很多不同的可能的方法可以做到这一点。哪一种是习惯性的或适当的取决于你想要初始化的东西。当然,设计师并没有做任何神奇的事情,只是在控制上设置属性。设计自定义控件的标准规则是,应该能够以任何顺序设置属性,无论是由用户还是由设计人员设置。 – 2012-02-17 23:43:46

+3

实现ISupportInitialize接口。 – 2012-02-18 00:52:14

+0

@HansPassant 我实现了ISupportInitialize,并将代码放在EndInit()中,但它从未被调用过。应该实施ISupportInitialize做些什么?我收回。一旦你创建了两次*,设计者在'InitializeComponent'期间添加了对'EndInit()'的调用。真的应该以答案的形式表达这个词。 – 2012-02-21 15:36:09

回答

1

执行ISupportInitialize接口。 Visual Studio会将代码添加到表单设计器代码文件,该文件在完成设置所有组件的属性后调用EndInit

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 
} 
0

假设你要执行一些代码时Control是“准备”:

如果你想立即执行时Control即使在表单显示之前,也是“准备就绪”的:在表单的构造函数中将该代码添加到InitializeComponent();之后。 (它只是它创建了Control的等等方法)

如果你想让它执行时,所示的形式,添加:

Shown += Form1_Shown; 

在窗体的构造函数,:

void Form1_Shown(object sender, EventArgs e) 
{ 
    //code to execute. 
} 

在窗体的类中。

相关问题