C# 父窗口不能关闭问题

Water Lee 2016-04-06 10:10:58
做了一个父子窗口的项目。当只打开一个子窗口,然后关闭子窗口,再关闭父窗口时,程序没有问题。但是如果同时打开多个子窗口,尤其是其中有一个子窗口添加了数据库中的数据时,全部关闭子窗口,再关闭父窗口时,发现不能关闭父窗口。原因不明,一开始以为是跟数据库有关系,但后来发现不是。不知道各位高人有没有遇到过同样的问题。
另外,我用的是VS2008,在程序中没有用第三方插件,只是用了自己改写过的一个DataGridView控件,测试只是不关闭,也不报错。
...全文
189 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Water Lee 2016-04-14
  • 打赏
  • 举报
回复
在父窗口中我只是做了一个强制要求关闭手动关闭子窗口
/// <summary>
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            foreach (System.Windows.Forms.Form f in this.MdiChildren)
            {
                System.Windows.Forms.MessageBox.Show("退出前,请先关闭[" + f.Text + "]窗口", " v1.0", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information);
                f.Activate();
                return;
            }
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
同时对父窗口做了一些处理如下:
#region 处理显示与关闭子窗口
        /// <summary>
        /// 显示指定窗口
        /// </summary>
        /// <param name="f">指定窗口</param>
        public void My_ShowMdiForm(Form f)
        {
            if (!f.IsDisposed)
            {
                foreach (Form fr in this.MdiChildren)
                {
                    if (f.Name == fr.Name)
                    {
                        fr.Activate();
                        return;
                    }
                }
                f.MdiParent = this;
                f.WindowState = FormWindowState.Maximized;
                f.StartPosition = FormStartPosition.Manual;
                f.Disposed += new EventHandler(My_MdiFormDisposed);
                f.Activated += new EventHandler(My_MdiFormActivated);
                f.Show();
            }
        }        
        private void My_MdiFormActivated(object sender, EventArgs e)
        {
            ((Form)sender).WindowState = FormWindowState.Maximized;
            ((Form)sender).StartPosition = FormStartPosition.Manual;
        }
        private void My_MdiFormDisposed(object sender, EventArgs e)
        {
            foreach (Form f in this.MdiChildren)
            {
                f.WindowState = FormWindowState.Maximized;
                break;
            }
        }
        #endregion
后来加了下面的代码解决的问题,但现在还是不理解
private void frm_main_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = false;//不添加此句主窗口可能无法关闭。
        }
debug时,发现当窗口不能关闭时,e.Cancel 值为true。一直找不到原因。因为关不掉父窗口时已经没有子窗口,也不可能执行Dispose事件。 由于项目急着测试使用,功能完成了也没有太多时间研究。先感谢各位的帮助和关注,暂不结贴,希望能有哪位给出一个原由。
江南小鱼 2016-04-07
  • 打赏
  • 举报
回复
debug一下,先定位出父窗体不能关闭抛出什么异常(别说不能关闭没异常,这个应该不可能,把你代码里面的try catch都先去掉),把异常定位到再对症下药。
imstrive 2016-04-07
  • 打赏
  • 举报
回复
e.cancel=true,那就不会执行窗体关闭功能了。另外最好贴出代码,大家才好帮你
jardyson 2016-04-07
  • 打赏
  • 举报
回复
请你理解 e.Cancel = true 意思,取消关闭为true,取消关闭为false,问题还要找吗?
兵工厂三剑客 2016-04-07
  • 打赏
  • 举报
回复
同意三四楼的看法,最好贴点代码大家看看。
tcmakebest 2016-04-07
  • 打赏
  • 举报
回复
大概是子窗体没关彻底
cookie_fei 2016-04-06
  • 打赏
  • 举报
回复
不太明白,还是帮你顶吧!最好贴点代码出来,特别是关闭窗体的地方。是不是有隐藏窗体出现?
Water Lee 2016-04-06
  • 打赏
  • 举报
回复
谢谢【nry19871012】 代码没有发现逻辑问题,运行时也不报错。 刚刚在 FormClosing 事件里捕捉到 e.Cancel 在关不掉的时候是 true,原因不明。 我直接把 e.Cancel =false,结果可以关掉窗口了,但不明白原因,不知道会不会有其它影响。
nry19871012 2016-04-06
  • 打赏
  • 举报
回复
只是现象描述,很难确定到具体的问题。来点实际的。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧