2010-01-15 73 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調用可以不同,所以依賴於所有者的所有內容都不應該在構造函數中。