C# 与表单加载事件相比,表单构造函数中应该包含哪些设置代码?

C# 与表单加载事件相比,表单构造函数中应该包含哪些设置代码?,c#,winforms,constructor,onload-event,C#,Winforms,Constructor,Onload Event,对于winforms应用程序,我想知道应该包含哪些设置代码: MainForm() 相对于 MainForm_加载(对象发送器、事件参数) 这里有什么最佳实践指南吗?快速浏览一下 在Windows窗体中使用构造函数 用于确保初始化是正确的 做得好。事件触发顺序为 不是一门精确的科学,你也不能 始终取决于 不管你做什么,事件都会发生 我以前见过 因此,微软 建议您处理 表单中的初始化代码 构造函数,假设您没有 好好享受一下 初始化可能会导致 时间切片或执行DoEvents() 使用VB6

对于winforms应用程序,我想知道应该包含哪些设置代码:

  • MainForm()
相对于

  • MainForm_加载(对象发送器、事件参数)
这里有什么最佳实践指南吗?

快速浏览一下

在Windows窗体中使用构造函数 用于确保初始化是正确的 做得好。事件触发顺序为 不是一门精确的科学,你也不能 始终取决于 不管你做什么,事件都会发生 我以前见过

因此,微软 建议您处理 表单中的初始化代码 构造函数,假设您没有 好好享受一下 初始化可能会导致 时间切片或执行DoEvents()


使用VB6的程序员倾向于在Load事件中放入大量代码,在VB6中,该事件用于初始化表单。但是这在Windows窗体中不再合适了,窗体类可以有一个构造函数。NET的方法是在构造函数中初始化类对象,对于表单类,没有什么令人信服的理由不这样做

Load事件在创建窗体的窗口句柄之后运行,就在用户看到它之前。您应该只在依赖于创建句柄的事件处理程序中编写代码。除了一种代码外,没有多少代码符合这一要求:需要知道窗口大小和位置的代码

窗体的设计时大小和位置属性值与窗体在另一台计算机上运行时的实际值不同。表单可以重新缩放以适应目标计算机上的系统字体大小或视频适配器DPI设置。用户首选项也起作用,用户可能为窗口标题选择了不同的字体大小。您通常不关心这些,除非您希望窗口在桌面上有一个特定的位置或与其他窗口对齐

在Load事件中编写初始化TreeView或ListView控件等操作的代码实际上会大大降低启动时间。当您在构造函数中执行此操作时,Windows窗体还不必更新物理窗口,它还没有被创建。创建本机控件后,Winforms将使用批量更新对其进行初始化,而不是像在加载事件中运行代码时那样一次更新一个节点/项。差别很大


最后但并非最不重要的一点:永远不要使用Load事件,应该重写OnLoad()方法。这确保了当您(或其他人)从表单类继承时,代码以可预测的顺序运行。IntelliSense帮助您编写此方法,只需键入“protected onl”并按tab键即可让IntelliSense自动完成此方法。请注意,您可以选择在base.OnLoad()调用之前或之后放置代码,这就是您控制谁是老板的方式。当你把它放在后面时,你就是老板,顺便说一句,通常不是正确的选择。

@astander:你能说出这篇文章中“初始化”的意思吗?例如,这是否意味着从数据库加载数据以显示表单控件?我会说是的,以及初始化控件、类等,如InitializeComponent()所示;用标准表格打电话。如前所述,请注意长时间运行的初始化,用户需要时可能会调用这些初始化,并显示“请稍候”之类的内容……“因此,Microsoft建议您在表单构造函数中处理初始化代码”-很高兴有此建议的来源。非常好的信息,谢谢-但在最后一点上,如果8年前为了鼓励程序员转向.NET,微软真的应该覆盖OnLoad,那么微软为什么要给我们加载事件,以便在VS中轻松使用,这是大家熟悉的编程模型。重写OnLoad也很容易,当您开始键入时,IntelliSense会完成80%的工作。但这需要打字而不是点击。不幸的是,“易于使用”并不总是意味着“正确使用”。很高兴知道(与我使用的其他一些框架不同)在Winforms中,您可以在构造函数中初始化控件。第三种可能性是所展示的事件。我发现像“this.Activate();”、“this.BringToFront();”和“this.Focus();”这样的东西比在FormLoad事件中更有可能在那里工作。请参阅可能的重复项