zoukankan      html  css  js  c++  java
  • form关闭时的一个奇特现象

    今天查一个错误时发现这个问题。
    有一个frmEdit。在Closing事件里面判断数据是否修改,然后提示用户是否需要保存数据。
    提供了三个按钮,yes,no,cancel。
    yes:保存数据,关闭窗体。
    no:直接关闭窗体。
    cancel:不关闭窗体。

    实际运行,点yes,cancel,处理都对,但是点 no,就会重复弹出这个对话框,
    如果一直点 no的话,就会一直出现。

    看一眼代码没有发现明显问题,实际调试才发现问题所在。
    代码如下:

    private void frmEdit_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
     if(DataChanged)
     {
      DialogResult dr=MessageBox.Show(this,"数据已修改,是否保存?", this.Text,MessageBoxButtons.YesNoCancel,MessageBoxIcon.Information,MessageBoxDefaultButton.Button3);
      if(dr==DialogResult.Yes)
      {
       SaveData();   
      }
                    else if (dr == DialogResult.No)
                    {
                        this.Close();
                    }
               else
                     e.Cancel = true;
     }
    }

    经调试发现 是 this.Close() 的问题,在执行这个函数后,程序有进这个事件处理过程了。
    修正方式很简单,注释掉这句代码就 OK 了。

    估计在 form的close函数调用了 closing事件。
    用reflector看了一下其代码。
    处理方式:
    close里面判断窗体是否已经创建,如果已经创建则 SendMessage(0x10, 0, 0);

    然后窗体消息处理函数收到这个msg会 调用 wmclose 函数。
    wmclose 调用了 OnClosing 函数,然后触发了 OnClosing事件。

    除了这些还有一些很奇特的现象:
    实际上调用是嵌套的,我在 this.Close();后面加上一句 MessageBox.Show(e.Cancel.ToString());

    然后第一次点 no,第二次 点 cancel。
    点完 Cancel 之后会看到 msgbox 提示信息是 False。
    说明又在第一次事件处理过程中了,而且 e.Cancel仍然是 False
    可是这样 窗体确仍然没有关闭

    最奇怪的是第二个现象
    窗体上放了一个 exit的按钮,把按钮设置为 form 的 CancelButton。
    进行了前面的操作之后,再点这个 exit 的按钮, closing 事件不触发了,窗体直接关闭了

    如果不是点 exit 按钮,而是点右上角的 X 按钮,就能够再次触发 closing 事件。
    然后就又和前面一样了。


     

  • 相关阅读:
    当tp5项目上传到服务器之后遇见的各种bug(不定期更新)
    解决LAMP下 服务器IP无法访问
    thinkphp5多图上传+同时删除本地文件
    from提交表单后 数据提交到后台 但不跳转页面 非ajax 用iframe
    window7 安装sass和compass
    开源操作系统课程设计
    Hadoop伪分布式搭建实验总结
    排序集合
    快排
    邻接矩阵
  • 原文地址:https://www.cnblogs.com/rick/p/901058.html
Copyright © 2011-2022 走看看