InitializeComponent()应该在代码顺序中出现在哪里?

时间:2012-08-15 08:02:40

标签: c# winforms visual-studio-2010

如果我创建了一个winForms“myForm”,则会生成以下样板代码:

public partial class myForm: Form
{
    public myForm() 
    {

       //<<position 1

       InitializeComponent();

       //<<position 2

    } 
}

如果我将额外的代码添加到构造函数方法中,如果我将代码放在位置1或2中,它会对应用程序的运行产生任何影响吗?

5 个答案:

答案 0 :(得分:13)

是的,确实如此。

InitializeComponent是VS生成的方法,负责在表单上创建和定位控件。

“位置1”中的代码将在控件存在之前执行。如果您尝试在此位置访问控件,则会获得NullReferenceException(例如,如果您尝试设置TextBox的内容)。 “位置2”中的类似代码将按预期工作。

虽然有“位置1”的用法:如果您有依赖于表单属性的自定义控件或行为,那么在“位置1”中设置这些属性可能会阻止在允许控件的情况下刷新代码在设置这些值之前创建。

答案 1 :(得分:2)

是。在InitializeComponent之前尚未创建所有控件。

答案 2 :(得分:1)

函数InitializeComponent()中的

;您可以创建放置在图形布局中的所有对象。如果你想访问它们,你的代码应该在position2。

答案 3 :(得分:0)

您放在button上的textboxcomboboxForm会自动创建一些代码。此代码在InitializeComponent()生成

因此,从position 1调用您在表单上设置的控件是错误,因为控件永远不会在该代码点创建。

您可以从position 2

调用和访问您在表单上添加的控件

答案 4 :(得分:0)

与此处的其他人一样,在大多数情况下应使用位置2。但是,也有例外情况,这两个职位都不起作用,你实际上必须将你的代码附加到另一个事件。

示例:您内部有 ScrollViewer 图片。您在图像组件中插入一个大图像文件,并希望显示它,以便在开始时可以看到图像的中心,并可以选择滚动查看图像的其余部分:

scrollViewer1.ScrollToVerticalOffset(scrollViewer1.ScrollableHeight / 2);

然而,在 InitializeComponent()之前或之后在构造函数中写这个(或者甚至在)中都不会给你想要的结果。 (因为,即使组件已在此阶段初始化,但所包含的图像文件也没有。)相反,您需要做的是附加一个新的事件处理程序 ImageOpened 图像并在那里编写命令。

ImageOpened EventHandler