Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何知道控件何时完成初始化?_.net_Winforms_Controls - Fatal编程技术网

.net 如何知道控件何时完成初始化?

.net 如何知道控件何时完成初始化?,.net,winforms,controls,.net,Winforms,Controls,我有一个.NET控件,用户可以将它放到窗体上 Visual Studio创建一个InitializeComponent,该组件从宿主窗体的构造函数调用: public EditItemForm() { InitializeComponent(); } 这个自动生成的方法在自动生成的文件中,根据设计器序列化规则初始化我的控件。e、 g: private void InitializeComponent() { ... this.lvResults = new Contoso.C

我有一个.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流媒体系统调用已加载 控件的窗体加载到内存后自动执行,以便 控件可以完成依赖于其他控件的任何初始化 窗体中的对象


假设您询问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()
的调用。我真的应该以答案的形式表达出来。