在子窗体的FormClosed事件中使用This.Owner.Close();怎么会报错,这样不是把父窗体关掉了吗?

解决方案 »

  1.   

    this.Owner.Close();
    如果Owner是主窗口的话,它关闭了程序就退出了。
    直接Application.Exit();即可。
      

  2.   

    Owner是主窗体
    我想在子窗体中用this.Owner.Close();
    关闭父窗体 
    但是报错  StackOverflowException 出现在未知模块
    难道是在子窗体中关闭父窗体,但是因为又要先关闭子窗体才能关闭父窗体,而子窗体的代码又没运行完,卡在this.Owner.Close();上,所以溢出错误吗?
    高手解释下
      

  3.   

    委托的实现如下:在子窗体中定义一个委托和事件
    public delegate void CloseEventHandler(object sender, EventArgs e);
    public event CloseEventHandler CloseEvent;
    然后在子窗体的Form_Closing事件中通知父窗体:
                if (this.CloseEvent != null)
                {
                    this.CloseEvent(sender, new EventArgs());
                }父窗体在创建子窗体时,监听子窗体的这个事件是否发生,如果发生,就关闭自己:            Form2 childForm = new Form2();
                childForm.CloseEvent += new Form2.CloseEventHandler(childForm_CloseEvent);
                childForm.Show();
            private void childForm_CloseEvent(object sender, EventArgs e)
            {
                this.Close();
            }
      

  4.   

    其实你已经知道大概原因了。
    父窗体的Close时会先关闭所有子窗体,当然就引发子窗体的FormClosed事件,但你在这个事件中又执行了父窗体的Close方法,导致子窗体的FormClosed事件不断的触发,没有结束的条件就堆栈溢出了。
      

  5.   

    你可以在Owner.Close()方法执行前将自己的FormClosed事件 -= 掉
      

  6.   


    你的想法是对的,其实你这么一试就知道了。
    1、你不去关闭子窗体,而是关闭父窗体,这个时候父窗体会自动去关闭子窗体,也就说会触发子窗体的Form_Closed事件
    2、你在子窗体Form_Closed事件中去关闭父窗体时,引用了this.Owner,其实这个时候子窗体的this已经不能访问了。
      

  7.   

    回8楼的观点2.
    虽然窗体关闭了,部分资源也释放了,this.Owner仍可以访问的。代码实验下。