实现子窗体关闭时也关闭主窗体的功能。
一、实现方法思考:
在子窗体的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();
}
此时关闭子窗体时就会同时关闭主窗体,使用了系统自带的委托事件,省去了自己定义委托的步骤。
------------------------------------------------------------------------------------------------------------------------------
入门程序小白的整理,自我总结经验的同时也分享出来给大家,若有说明有误的部分还请指正,多多见谅。