2015-01-21 14 views
1

因此,在使用其他語言幾年後,我再次重新學習C#和.NET框架,並且我希望有人能夠回答「最佳實踐」問題。何處爲C#表單提供「On Load」代碼

看着題爲「Choose_File」,我已經把我的「負載」代碼

的InitializeComponent之後()的新形式,下面的代碼;

行,因爲某些原因,我認爲這是「上載」方法。在使用這種方法創建了一對錶單之後,我不小心雙擊了表單的標題,並打開了真正的「_Load」方法,我假設我應該一直放置「on load」代碼。所以我的問題是,從實際意義上來說,這兩種方法之間的真實世界差異究竟是什麼,因爲兩者似乎都有效?當表單是所示

namespace Personal_Finance_Manager 
{ 
    public partial class Choose_File : Form 
    { 
     public Choose_File() 
     { 
      InitializeComponent(); 
     } 

     private void Choose_File_Load(object sender, EventArgs e) 
     { 

     } 
    } 
} 
+2

http://stackoverflow.com/questions/13860609/load-onload-constructor – MHC 2015-01-21 05:22:45

+0

因此,根據上述文章,似乎我是正確的將代碼放入構造函數而不是負載?這是因爲構造函數在表單初始化時運行,因此影響表單將要如何顯示的任何內容都應該在該點上運行,而不是在表單已經顯示之後進行更改,就像在代碼放置在負載? – BenW301 2015-01-21 05:25:39

+0

海事組織是個人喜好。我只想初始化表單在構造函數中需要的變量,如果我必須設置TextBox,label等的文本,我會在OnLoad上執行。 – MHC 2015-01-21 05:27:56

回答

1

您應儘早初始化類元素。對於大多數情況,這將在構造函數中。你可以在這裏初始化控制屬性,類字段等,它會正常工作。

但是,有些事情你不能用Control實例(包括Form子類)來做,直到創建了底層的本地窗口句柄爲止。對於這些類型的初始化,覆蓋OnLoad()(或處理Load事件)並執行初始化(僅)是適當的。作爲一個例子,當我顯示一個表單來顯示後臺任務的進度時,我將處理ShownLoad事件(爲此目的,它們是等效的),直到此時纔開始後臺任務。這可以確保後臺任務的完成速度非常快,以至於表單在完成時尚未完全初始化,這將阻止後任務代碼關閉表單(您無法關閉尚未完成的表單打開了:))。

+0

因此,如果我正確理解你,我所有的「這是窗體的初始狀態」代碼應該在構造函數中,並且所有「這些都是可以改變或改變基本狀態的東西」進入加載,以防止它們在加載初始表單之前被觸發? – BenW301 2015-01-21 05:33:33

+1

我不確定你的意思是「基本狀態」,但我認爲不,我不是這麼說的。表單具有各種狀態,甚至在構造函數中初始化的狀態,在用戶與它交互時可能會改變,這很好。但是,所有屬於「初始化」的東西(即設置表單的_initial_值),我儘可能早地做到這一點,以儘量減少對象中的重複工作。如果出現的東西不能在構造函數中安全地完成,那麼我將它推遲到'OnLoad()'或等價物。 – 2015-01-21 05:38:26

1

OnLoad事件被觸發(Form.Show()被調用)。無論何時創建表單的新實例,都會調用該構造函數,即使它尚未顯示。

僅當向用戶顯示錶單(即實例化類成員)時才應執行的代碼會在OnLoad處理程序上執行,需要執行的代碼之前,表單將顯示在構造函數中。

+3

請注意,「OnLoad()」,「Load」事件和「Shown」被調用/只會提高窗體顯示的_first_時間。例如,如果您稍後再設置'Visible = false;'然後'Visible = true;',或者稍後再調用Hide()'和Show()',則不會再獲得另一個'顯示事件。請參閱[Form.Shown事件](https://msdn.microsoft.com/en-us/library/system.windows.forms.form.shown(v = vs.110).aspx)和[Windows中的事件順序窗體](https://msdn.microsoft.com/en-us/library/86faxx0d(v = vs.110).aspx) – 2015-01-21 05:31:55