在主表單中有一個Panel控制元件,用戶通過點擊將不同的子表單添加到Panel中。主表單中的方法如下:
private void OpenForm(Form form)
{
panel.Controls.Clear();
form.TopLevel = false;
form.Dock = DockStyle.Fill;
form.FormBorderStyle = FormBorderStyle.None;
form.WindowState = FormWindowState.Maximized;
panel.Controls.Add(form);
form.Show();
}
每一個子表單中都有Load等事件,
期望的效果是每次添加子表單都要執行它的Load等事件處理程式。
但以上代碼再次將同一表單添加到Panel控制元件時,不會再執行Load等事件處理程式。
原以為是在添加表單前、清除panel控制元件后,以前的表單仍存在,于是在清除控制元件之前增加了:
foreach (Control control in panel.Controls)
{
if (control is Form f)
{
f.Dispose();
GC.Collect();
}
}
但是主表單的代碼form.Show()會出現“無法訪問已釋放的物件”的錯誤。
奇怪的是我釋放的是panel中已存在的表單而不是方法中傳入的表單form.
請問如何才能再次將同一子表單添加到panel中時,每次都要執行子表單中的Load等事件?謝謝
uj5u.com熱心網友回復:
你第一個函式是傳入一個form 所以這個form是已經初始化好了的 已經執行過Load當然不會執行了 不知道你具體的邏輯 最簡單的是每一次都重新new一個formuj5u.com熱心網友回復:
Load是第一次Show出來的時候觸發的,你可以將事件方法公開出來,手工去呼叫。注意表單的生存周期,點關閉的時候視窗句柄就釋放了,只是托管物件還在,所以再次呼叫時會報錯。如果想重用視窗,只能Hide,不能呼叫Close();uj5u.com熱心網友回復:
希望每次將表單添加到panel中時都執行表單的Load事件是因為需要每次都從資料庫重新給界面控制元件賦值uj5u.com熱心網友回復:
問問題前,請先自己百度一下https://blog.csdn.net/fengxing11/article/details/56854203
Load:在第一次顯示表單前發生
Shown:只有在首次顯示表單時才會引發 Shown 事件;隨后執行的最小化、最大化、還原、隱藏、顯示或無效化和重新繪制操作都不會引發該事件。
ok了,你的問題是什么??請注意“第一次”
so,解決方案來了
1.他只會發生一次,那么請重新new,以保證他每次都是第一次
2.如果不想重新new,請把你的代碼寫到一個方法里,add的時候自己手動呼叫
uj5u.com熱心網友回復:
每次添加新的 form 實體,而不是之前的同一個實體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/226765.html
標籤:C#
