13

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

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

       //<<position 1

       InitializeComponent();

       //<<position 2

    } 
}

如果我在构造函数方法中添加额外的代码,如果我将代码放在位置 1 或 2 对应用程序的运行有什么影响吗?

4

5 回答 5

18

是的,它确实。

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

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

但是,“位置 1”是有用的:如果您有依赖于表单属性的自定义控件或行为,如果您允许在这些属性之前创建控件,则将这些属性设置在“位置 1”可能会阻止该代码必须刷新值已设置。

于 2012-08-15T08:07:38.887 回答
3

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

于 2012-08-15T08:07:19.760 回答
2

在函数 InitializeComponent() 中;你创建了你放在图形布局中的所有对象。如果你想访问它们,你的代码应该在 position2。

于 2012-08-15T08:07:13.097 回答
1

你放在上面的, button,textbox会自动创建一些代码。这个代码是在 comboboxFormInitializeComponent()

因此,调用您放置在 Form 上的控件position 1错误的,因为控件从未在该代码点创建。

您可以调用和访问您放置在表单上的控件position 2

于 2012-08-15T08:55:41.640 回答
0

就像这里的其他人所说的那样,在大多数情况下应该使用位置 2。但是,也有两个位置都不起作用的例外情况,您实际上必须将代码附加到另一个事件。

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

scrollViewer1.ScrollToVerticalOffset(scrollViewer1.ScrollableHeight / 2);

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

ImageOpened 事件处理程序

于 2016-02-18T11:24:01.310 回答