天天看點

C# 子窗體關閉主窗體的方法

實作子窗體關閉時也關閉主窗體的功能。

一、實作方法思考:

在子窗體的close事件中調用某一種方法,該方法等同于主窗體的this.Close方法。是以核心問題就是如何實作在子窗體中調用與此相關的方法?

(1)如果直接選擇在子窗體的close事件中new一個新的“主窗體”對象,然後調用該窗體的close方法,顯然是不可行的,因為這個“主窗體”是被子窗體建立出來的,相當于子窗體的子窗體,所調用的close方法也不是主窗體所在的close方法。

C# 子窗體關閉主窗體的方法

(2)如果選擇在主窗體中寫一個靜态方法,然後子窗體通過類名點的方式調用主窗體的靜态方法

來實作this.Close功能。顯然也不可行,因為靜态方法不能通路非靜态變量。

C# 子窗體關閉主窗體的方法

以下提供兩種解決這個問題的方案。

二.解決方案實作

方案一:靜态字段——調用對象的引用

聲明一個靜态的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();

}

此時關閉子窗體時就會同時關閉主窗體,使用了系統自帶的委托事件,省去了自己定義委托的步驟。

繼續閱讀