天天看点

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();

}

此时关闭子窗体时就会同时关闭主窗体,使用了系统自带的委托事件,省去了自己定义委托的步骤。

继续阅读