模态窗体隐藏执行两次FormClosing

xiaominglang 2014-07-23 11:00:21
从一个窗体弹出一个模态窗体


private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
Visible = false;
}

在关闭时,会执行两次FormClosing,很不理解
求大神指导
...全文
285 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2014-07-24
  • 打赏
  • 举报
回复
我理解了 对于模态窗体 关闭就是隐藏 释放资源 是在清空模态窗体对象所在对象的时候清空 这样理解对不对?@Z65443344 @andywangguanxi
「已注销」 2014-07-24
  • 打赏
  • 举报
回复
引用 34 楼 andywangguanxi 的回复:
MSDN 上关于FormClosing事件当窗体为模态时的解释 http://msdn.microsoft.com/zh-cn/library/system.windows.forms.form.formclosing.aspx 事实上,窗体为模态时,点了X按钮关闭窗体,该对象还是存在的
原来是这样 我还很不理解 我明明把窗体关掉了 窗体对象居然还不为空
引用 35 楼 Z65443344 的回复:
[quote=引用 34 楼 andywangguanxi 的回复:] MSDN 上关于FormClosing事件当窗体为模态时的解释 http://msdn.microsoft.com/zh-cn/library/system.windows.forms.form.formclosing.aspx 事实上,窗体为模态时,点了X按钮关闭窗体,该对象还是存在的
没错,否则主窗体获取showdialog的值就该获取不到了,模态窗体的变量也都获取不到了,那存在的意义也就没了. 只有当new form()的代码段走完了,窗体才会真正释放掉. 至于说closing会一直循环,那不会,只有visible从true变为false的时候才触发,第二次执行,已经是false了,不会再次触发.[/quote] 那就是说执行完Form1中的Button_Click之后才会清空模态窗体的资源吗?
於黾 2014-07-24
  • 打赏
  • 举报
回复
引用 34 楼 andywangguanxi 的回复:
MSDN 上关于FormClosing事件当窗体为模态时的解释 http://msdn.microsoft.com/zh-cn/library/system.windows.forms.form.formclosing.aspx 事实上,窗体为模态时,点了X按钮关闭窗体,该对象还是存在的
没错,否则主窗体获取showdialog的值就该获取不到了,模态窗体的变量也都获取不到了,那存在的意义也就没了. 只有当new form()的代码段走完了,窗体才会真正释放掉. 至于说closing会一直循环,那不会,只有visible从true变为false的时候才触发,第二次执行,已经是false了,不会再次触发.
於黾 2014-07-23
  • 打赏
  • 举报
回复
关闭的时候怎么关闭的,直接点X?
於黾 2014-07-23
  • 打赏
  • 举报
回复
引用 19 楼 andywangguanxi 的回复:
e.Cancel = true; 去掉就只执行一次了
跟那个没有关系.我测试的时候加上这句,也只执行一次.
EdsionWang 2014-07-23
  • 打赏
  • 举报
回复
e.Cancel = true; 去掉就只执行一次了
「已注销」 2014-07-23
  • 打赏
  • 举报
回复
引用 17 楼 Z65443344 的回复:
只有这一处,自动生成的代码,你没有手动添加事件吧
没有
於黾 2014-07-23
  • 打赏
  • 举报
回复
只有这一处,自动生成的代码,你没有手动添加事件吧
「已注销」 2014-07-23
  • 打赏
  • 举报
回复
引用 15 楼 Z65443344 的回复:
08下测试,没有问题

        private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // Form2
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(284, 262);
            this.Name = "Form2";
            this.Text = "Form2";
            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form2_FormClosing);
            this.ResumeLayout(false);

        }
於黾 2014-07-23
  • 打赏
  • 举报
回复
08下测试,没有问题
於黾 2014-07-23
  • 打赏
  • 举报
回复
你是否为closing注册了2次事件? 将注册事件的代码放出来
「已注销」 2014-07-23
  • 打赏
  • 举报
回复
引用 9 楼 Z65443344 的回复:
我这里测试,只执行一次啊
额 怎么回事 我这边跟断点就是两次 是vs版本问题么 我用的08的
於黾 2014-07-23
  • 打赏
  • 举报
回复
你可以向微软报告BUG了,等着拿奖金吧
「已注销」 2014-07-23
  • 打赏
  • 举报
回复
引用 10 楼 Z65443344 的回复:
新开个工程测试,也这样?
什么都没做 只是执行以下弹出 然后点击关闭 就执行两次FormClosing
於黾 2014-07-23
  • 打赏
  • 举报
回复
新开个工程测试,也这样?
於黾 2014-07-23
  • 打赏
  • 举报
回复
我这里测试,只执行一次啊
「已注销」 2014-07-23
  • 打赏
  • 举报
回复
引用 3 楼 luluyy 的回复:
贴跳转完整代码 还有跟跳转在一起的代码与方法 你发的代码没问题
代码贴在5楼了
「已注销」 2014-07-23
  • 打赏
  • 举报
回复
引用 6 楼 hbu_pig 的回复:
你这样关闭得了吗?只能隐藏吧。。。。
我就是为了隐藏 不是关闭 但是它执行了两次FormClosing 这个我很不理解
欢乐的小猪 2014-07-23
  • 打赏
  • 举报
回复
你这样关闭得了吗?只能隐藏吧。。。。
「已注销」 2014-07-23
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
这里代码没有问题,放出你开窗体的代码,是否在showdialog之后又执行了close
简单的测试工程 主窗体:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 fr = new Form2();
            fr.ShowDialog();
        }
    }
}
弹出模态窗:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;
            Visible = false;
        }
    }
}
还是有问题
加载更多回复(17)

110,502

社区成员

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

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

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