回答
该Form.Shown event是一个很好的地方做任何可能需要超过一秒钟的初始化。 Form.Shown只发生一次,仅在后窗体首先对用户可见。
显然,如果你有一个漫长的初始化,你仍然需要提供某种形式的视觉反馈,并可能会禁用表单的各个部分,直到完成。但是,如果初始化是不可避免的,Form.Shown至少允许你让用户知道应用程序没有被冻结,并给出了它实际正在做什么的反馈。
与Form.Load相比:从用户角度来看,您的应用程序将被视为更快地启动,因为您的表单在初始化完成时已经可见。
相比Form.Activated:您不必担心运行多次的初始化,因为激活的事件被称为每次你的形式隐藏/显示,最小化/最大化时间等
相比构造函数:与Form.Load相似,只有初始化完成后,表单才会可见。另外,您必须更加小心与可能未完全初始化的控件有关的时序/序列问题。
我尝试过使用Shown事件,并发现它不起作用,正如您所描述的:每次显示对话框时都会再次运行该方法。因此,如果我使用它来填充列表框,那么每次显示对话框时都会重复这些项目。我很困惑.... – Stewart 2017-03-07 19:17:26
在Load事件中做东西时,会造成异常,当它失败时稍微容易阅读并且恕我直言在语义上更清洁。实际上,这不会造成很大的差异。
对于较重的初始化,它通常在加载事件中完成。构造函数通常用于快速,简单的字段初始化。例如,如果您必须对外部依赖项进行方法调用,则应从加载完成。
这取决于初始化的种类。例如,简单的字段初始化可以在构造函数中完成,这样可以避免您必须挂接事件,拥有其他方法等。
但是,在某些情况下,构造函数没有您的信息需要。例如,如果您想根据您是处于设计模式还是运行模式来做不同的事情(例如,在运行模式下,您将连接到数据源,但在设计模式下,您希望显示示例数据),那么这必须被推迟到构建之后,因为框架在构造对象之后才设置DesignMode。
实际上并非如此。您可以检查构造函数中的LicenseManager.UsageMode(以及构造函数中的* only *)以检查您是否处于设计模式。 – Eric 2010-01-15 07:18:15
较重的初始化在加载事件中也可能不是一个好主意,因为它可能会增加加载时间并且可能会让最终用户感到不适。我更喜欢在Form Load中做一个基本的初始化(比如说......需要花费< 10秒),并在向用户显示之后完成其余的繁重工作。要让用户等待进度指示器可以显示。
想想如果您为相同的表单运行两次Show
或ShowDialog
会发生什么情况。这两个调用之间不能改变的所有东西都应该在构造函数中;所有初始化代码都取决于根据显示(对话框)调用必须处于将为每个调用调用的事件处理程序中。例如,表单的所有者将在ShowDialog
中传递,而不是在构造函数中传递,并且对于2个不同的ShowDialog
调用可以不同,所以依赖于所有者的所有内容都不应该在构造函数中。
- 1. 哪里更好地初始化字段?
- 2. os.environ初始化在哪里?
- 3. 在哪里初始化TempData
- 4. JSP在哪里初始化?
- 5. 哪里是最好的地方在Rails中初始化Singleton?
- 6. 哪种形式的初始化更好?
- 7. forks.c的total_forks在哪里初始化?
- 8. Python的sys.path在哪里初始化?
- 9. 在哪里初始化我的TableView DataController?
- 10. QGLWidget paintEvent:在哪里初始化openGL?
- 11. 在哪里初始化木材和crashlytics
- 12. 在哪里初始化一个NSMutableArray?
- 13. 我在哪里初始化NSMutable Dictionary?
- 14. MSTAPI请求ID在哪里初始化?
- 15. CherryPy + Jinja,在哪里初始化环境
- 16. _mainViewController在哪里声明和初始化?
- 17. noty在初始化工作
- 18. 更好的初始化
- 19. 初始化后未初始化的全局变量的位置在哪里?
- 20. C++数组初始化,好的做法
- 21. 初始化器列表初始化的数组存储在哪里?
- 22. 哪里是初始化API的好地方?
- 23. 从哪里初始化GCM的ID?
- 24. 在Flux/React.js中,在哪里初始化jQuery插件?
- 25. 在哪里初始化UITableViewController中的多个实例的结构
- 26. 在哪里初始化经过验证的序列化字段?
- 27. AS3中初始化类变量的“适当”位置在哪里
- 28. Android在哪里初始化小部件中的Crashlytics?
- 29. 在哪里初始化ASP.NET MVC 3中的ObjectFactory?
- 30. 在哪里初始化React容器中的Socket对象?
可能重复的[Winforms窗体构造函数与加载事件](http://stackoverflow.com/questions/264396/winforms-form-constructor-vs-load-event) – 2016-07-07 14:35:46