實作子窗體關閉時也關閉主窗體的功能。
一、實作方法思考:
在子窗體的close事件中調用某一種方法,該方法等同于主窗體的this.Close方法。是以核心問題就是如何實作在子窗體中調用與此相關的方法?
(1)如果直接選擇在子窗體的close事件中new一個新的“主窗體”對象,然後調用該窗體的close方法,顯然是不可行的,因為這個“主窗體”是被子窗體建立出來的,相當于子窗體的子窗體,所調用的close方法也不是主窗體所在的close方法。

(2)如果選擇在主窗體中寫一個靜态方法,然後子窗體通過類名點的方式調用主窗體的靜态方法
來實作this.Close功能。顯然也不可行,因為靜态方法不能通路非靜态變量。
以下提供兩種解決這個問題的方案。
二.解決方案實作
方案一:靜态字段——調用對象的引用
聲明一個靜态的Form1主窗體字段,在主窗體初始化時給這個靜态字段指派主窗體對象的引用,子窗體Close方法中通過直接調用主窗體的靜态引用進而調用到對應的Close方法即可。
(1)一類方法:在主窗體中建立靜态字段
public static Form1 form;
public Form1()
{
form = this;
InitializeComponent();
}
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
Form1.form.Close();
}
(2)二類方法:在入口中建立靜态字段
static class Program
{
public static Form1 form;
///
/// 應用程式的主入口點。
///
[STAThread]
static void Main()
{
form = new Form1();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(form);
}
}
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
Program.form.Close();
}
方案二:委托——調用方法的引用
如果方案一是調用對象的引用進而間接地調用到對象中對應的方法,那麼可不可以直接通過調用方法的引用進而直接得到對應的方法呢?答案是可行的,即把主窗體A當中的Close方法委托給C,讓子窗體B在自己的Close方法中調用C(A對應方法的引用)即可完成調用主窗體A中的對應Close方法。
(1)一類方法:自定義委托
①在主窗體中定義一個無傳回值無參數的委托。和類平級,定義在類的外部。
//定義委托
public delegate void CloseEventHandler();
②在主窗體中定義對應的Close方法(該方法的傳回值、參數類型和委托對應相同)。
public void FormClose()
{
this.Close();
}
③在子窗體的類裡面定義一個委托變量。
public CloseEventHandler closeEventHandler;
④子窗體執行個體化的同時給子窗體中對應的委托變量指派主窗體中Close方法的引用。
private void button1_Click(object sender, EventArgs e)
{
Form2 form = new Form2();
form.closeEventHandler = FormClose;
form.Show();
}
⑤此時在子窗體中調用自己的委托即可調用到主窗體中對應的Close方法
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
if (closeEventHandler != null)
{
closeEventHandler.Invoke();
//簡寫
//closeEventHandler();
}
//簡寫
//closeEventHandler?.Invoke();
}
(2)二類方法:委托事件
上述一類方法中的委托也可以完全用系統自帶的事件來解決。子窗體在關閉時會觸發一個FormClosed事件,隻需給這個事件添加一個關聯的Close處理方法,在子窗體關閉的同時也會對應調用這個方法。
①主窗體中給FormClosed事件關聯一個Close處理方法(方法如②)
private void button1_Click(object sender, EventArgs e)
{
Form2 form = new Form2();
form.FormClosed += new FormClosedEventHandler(FormClose);
form.Show();
}
②主窗體中定義一個參數和FormClosedEventHandler委托事件相同的Close方法
public void FormClose(object sender,EventArgs e)
{
this.Close();
}
此時關閉子窗體時就會同時關閉主窗體,使用了系統自帶的委托事件,省去了自己定義委托的步驟。