2010-01-15 70 views
7

在Load事件或InitializeComponent()之后的构造函数中?在winform中做更好的初始化工作在哪里?

或根本不重要?

+0

可能重复的[Winforms窗体构造函数与加载事件](http://stackoverflow.com/questions/264396/winforms-form-constructor-vs-load-event) – 2016-07-07 14:35:46

回答

5

Form.Shown event是一个很好的地方做任何可能需要超过一秒钟的初始化。 Form.Shown只发生一次,仅在窗体首先对用户可见。

显然,如果你有一个漫长的初始化,你仍然需要提供某种形式的视觉反馈,并可能会禁用表单的各个部分,直到完成。但是,如果初始化是不可避免的,Form.Shown至少允许你让用户知道应用程序没有被冻结,并给出了它实际正在做什么的反馈。

与Form.Load相比:从用户角度来看,您的应用程序将被视为更快地启动,因为您的表单在初始化完成时已经可见。

相比Form.Activated:您不必担心运行多次的初始化,因为激活的事件被称为每次你的形式隐藏/显示,最小化/最大化时间等

相比构造函数:与Form.Load相似,只有初始化完成后,表单才会可见。另外,您必须更加小心与可能未完全初始化的控件有关的时序/序列问题。

+0

我尝试过使用Shown事件,并发现它不起作用,正如您所描述的:每次显示对话框时都会再次运行该方法。因此,如果我使用它来填充列表框,那么每次显示对话框时都会重复这些项目。我很困惑.... – Stewart 2017-03-07 19:17:26

1

在Load事件中做东西时,会造成异常,当它失败时稍微容易阅读并且恕我直言在语义上更清洁。实际上,这不会造成很大的差异。

4

对于较重的初始化,它通常在加载事件中完成。构造函数通常用于快速,简单的字段初始化。例如,如果您必须对外部依赖项进行方法调用,则应从加载完成。

2

这取决于初始化的种类。例如,简单的字段初始化可以在构造函数中完成,这样可以避免您必须挂接事件,拥有其他方法等。

但是,在某些情况下,构造函数没有您的信息需要。例如,如果您想根据您是处于设计模式还是运行模式来做不同的事情(例如,在运行模式下,您将连接到数据源,但在设计模式下,您希望显示示例数据),那么这必须被推迟到构建之后,因为框架在构造对象之后才设置DesignMode。

+0

实际上并非如此。您可以检查构造函数中的LicenseManager.UsageMode(以及构造函数中的* only *)以检查您是否处于设计模式。 – Eric 2010-01-15 07:18:15

3

较重的初始化在加载事件中也可能不是一个好主意,因为它可能会增加加载时间并且可能会让最终用户感到不适。我更喜欢在Form Load中做一个基本的初始化(比如说......需要花费< 10秒),并在向用户显示之后完成其余的繁重工作。要让用户等待进度指示器可以显示。

0

想想如果您为相同的表单运行两次ShowShowDialog会发生什么情况。这两个调用之间不能改变的所有东西都应该在构造函数中;所有初始化代码都取决于根据显示(对话框)调用必须处于将为每个调用调用的事件处理程序中。例如,表单的所有者将在ShowDialog中传递,而不是在构造函数中传递,并且对于2个不同的ShowDialog调用可以不同,所以依赖于所有者的所有内容都不应该在构造函数中。