今日在寫代碼時,需要在子窗體運行時調用基類窗體中的load事件,順帶將該部分功能做一個詳細的了解。
Winform窗體在初始化到呈現在用戶眼前會依次經歷三個階段,構造-加載-顯示,分別對應.NET 窗體中的 InitializeComponent,onLoad,show三個調用函數,以下:
InitializeComponent:初始化窗體及窗體上的控件,加載並分配資源,注冊相關事件
onLoad:注冊裝載窗口事件,是窗體啟動時調用該函數,觸發formload事件,從而調用From_Load事件處理函數
show:用於顯示窗體,這個沒什么好說的。
InitializeComponent函數在類的初始化時調用,在寫程序時,有關界面布局的重新調用或整理,要么寫入InitializeComponent()函數中,要么寫入From_Load事件處理函數中(一般是后者,方便閱讀和維護),如果在構造函數中寫在InitializeComponent()函數的后面,可能會造成意想不到的錯誤。
當一個子類窗體調用基類窗體時,其中執行順序如下:基類窗體構造函數(窗體構造函數必須包含InitializeComponent,下同),子類窗體構造函數,子類onload函數,基類onload函數(基類一般不需要該函數),基類From_Load事件處理函數,子類From_Load事件處理函數。
例如,如果我希望在子窗體實現自己的邏輯前先調用基類窗體的From_Load事件處理函數,可以如下調用:
基類窗體代碼:
namespace FormLoadExcise { public partial class BaseFrm : Form { public BaseFrm() { InitializeComponent(); } private void BaseFrm_Load(object sender, EventArgs e) { foreach (Control control in Controls) { control.Text = "some text"; } } } }
子類窗體代碼(事后調用基類窗體的From_Load事件處理函數)
namespace FormLoadExcise { public partial class ChildFrm : BaseFrm { public ChildFrm() { InitializeComponent(); } protected override void OnLoad(EventArgs e) { this.button1.Text = "other text"; this.label2.Text = "other text"; base.OnLoad(e); } } }
子類窗體代碼(事前調用基類窗體的From_Load事件處理函數)
namespace FormLoadExcise { public partial class ChildFrm : BaseFrm { public ChildFrm() { InitializeComponent(); } private void ChildFrm_Load(object sender, EventArgs e) { this.button1.Text = "other text"; this.label2.Text = "other text"; } } }