如果我创建一个 winForms“myForm”,则会生成以下样板代码:
public partial class myForm: Form
{
public myForm()
{
//<<position 1
InitializeComponent();
//<<position 2
}
}
如果我在构造函数方法中添加额外的代码,如果我将代码放在位置 1 或 2 对应用程序的运行有什么影响吗?
如果我创建一个 winForms“myForm”,则会生成以下样板代码:
public partial class myForm: Form
{
public myForm()
{
//<<position 1
InitializeComponent();
//<<position 2
}
}
如果我在构造函数方法中添加额外的代码,如果我将代码放在位置 1 或 2 对应用程序的运行有什么影响吗?
是的,它确实。
InitializeComponent
是 VS 生成的负责在窗体上创建和定位控件的方法。
“位置 1”中的代码将在控件存在之前执行。如果您尝试访问此位置的控件,您将获得 a NullReferenceException
(例如,如果您尝试设置 a 的内容TextBox
)。“位置 2”中的类似代码将按预期工作。
但是,“位置 1”是有用的:如果您有依赖于表单属性的自定义控件或行为,如果您允许在这些属性之前创建控件,则将这些属性设置在“位置 1”可能会阻止该代码必须刷新值已设置。
是的。在 InitializeComponent 之前,尚未创建所有控件。
在函数 InitializeComponent() 中;你创建了你放在图形布局中的所有对象。如果你想访问它们,你的代码应该在 position2。
你放在上面的, button
,textbox
会自动创建一些代码。这个代码是在 combobox
Form
InitializeComponent()
因此,调用您放置在 Form 上的控件position 1
是错误的,因为控件从未在该代码点创建。
您可以调用和访问您放置在表单上的控件position 2
就像这里的其他人所说的那样,在大多数情况下应该使用位置 2。但是,也有两个位置都不起作用的例外情况,您实际上必须将代码附加到另一个事件。
示例:您在其中有一个ScrollViewer和一个Image。您在Image组件中插入一个大图像文件并希望显示它,以便图像的中心在开始时可见,并且可以选择滚动以查看图像的其余部分:
scrollViewer1.ScrollToVerticalOffset(scrollViewer1.ScrollableHeight / 2);
但是,在InitializeComponent()之前或之后(甚至在)中将其写入构造函数不会给您想要的结果。(因为,即使在这个阶段已经初始化了组件,但包含的图像文件还没有。)相反,您要做的是将新的事件处理程序 ImageOpened附加到图像并在那里编写命令。