【C#】实用小技巧分享:子窗体关闭主窗体

实现子窗体关闭时也关闭主窗体的功能。

一、实现方法思考:

在子窗体的close事件中调用某一种方法,该方法等同于主窗体的this.Close方法。所以核心问题就是如何实现在子窗体中调用与此相关的方法?

(1)如果直接选择在子窗体的close事件中new一个新的“主窗体”对象,然后调用该窗体的close方法,显然是不可行的,因为这个“主窗体”是被子窗体新建出来的,相当于子窗体的子窗体,所调用的close方法也不是主窗体所在的close方法。【C#】实用小技巧分享:子窗体关闭主窗体_第1张图片

 

(2)如果选择在主窗体中写一个静态方法,然后子窗体通过类名点的方式调用主窗体的静态方法

来实现this.Close功能。显然也不可行,因为静态方法不能访问非静态变量。

【C#】实用小技巧分享:子窗体关闭主窗体_第2张图片

 

 

以下提供两种解决这个问题的方案。

二.解决方案实现

方案一:静态字段——调用对象的引用

声明一个静态的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();
        }

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

------------------------------------------------------------------------------------------------------------------------------

入门程序小白的整理,自我总结经验的同时也分享出来给大家,若有说明有误的部分还请指正,多多见谅。

 

你可能感兴趣的:(c#,visual,studio,开发语言,.net,经验分享)