WinForm-用戶控件的初始化順序問題
在UserControl與其引用窗體的InitialComponent方法、構造方法、Load事件都加上了MessageBox.Show方法,這才發現控件與窗體的初始化順序並不像自己想象的那樣:
最初以爲的順序: | UerControl.InitialComponent --> |
| UerControl.構造方法 --> |
| UerControl.Load --> |
| 引用窗體.InitialComponent --> |
| 引用窗體.構造方法 --> |
| 引用窗體.Load |
實際正確的順序: | UerControl.InitialComponent --> |
| UerControl.構造方法 --> |
| 引用窗體.InitialComponent --> |
| 引用窗體.構造方法 --> |
| UerControl.Load --> |
| 引用窗體.Load |
我寫的那些Resize和SizeChanged事件是放在UserControl.Load中的,在設計階段對UserControl的Size所做的調整並沒有被這些事件所捕獲,因爲窗體設計階段的代碼在引用窗體的InitialComponent方法中,而這個方法卻在UserControl.Load之前被調用。
總結
自定義控件的初始化應該放在其構造方法中,而不是放在Load事件對應的處理程序中。
從窗體設計器自動生成的代碼可以看出,窗體或控件的InitialComponent是放在其構造方法中的,而這些代碼是窗體設計器自動生成的,裏面包括許多控件變量的聲明等的,所以,我們應該把InitialComponent這些代碼放在構造方法的最前面。即,我們對窗體或控件的初始化應該放在構造方法中、InitialComponent方法的後面。
public ColorfulBorderTextBox()
{
InitializeComponent();//這是窗體設計器自動生成的代碼
//這裏是你自己的代碼,以進行一些必要的初始化///////////
Initialize(); //設置屬性默認值,進行一些初始化//////
EventHandling();//設置事件監聽程序////////////////////
///////////////////////////////////////////////////////
}