form关闭时的一个奇特现象

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

今天查一个错误时发现这个问题。
有一个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 事件。
然后就又和前面一样了。


 

目录
相关文章
|
8月前
|
存储 JavaScript 前端开发
好烦,怎么输入拼音的过程也会触发input事件!!!
好烦,怎么输入拼音的过程也会触发input事件!!!
204 0
|
5月前
|
移动开发 前端开发 JavaScript
惊爆!一键解锁HTML父页面神秘技能,子页面Dialog华丽登场,让你的网页交互瞬间高大上,用户体验飙升!
【8月更文挑战第4天】在Web开发中,常需从父页面弹出子页面或对话框(Dialog)进行互动。HTML5虽引入了<dialog>元素,但许多开发者偏好使用自定义方案以获得更好的兼容性和样式控制。本示例利用HTML、CSS及JavaScript创建一个可弹出子页面的模态框:首先,在父页面中定义一个按钮触发弹出效果;接着,设置隐藏的模态框容器,内含一个iframe用于加载子页面;然后,通过CSS设定模态框样式;最后,借助JavaScript控制模态框的显示与隐藏。此方案灵活且易于定制,适用于多种应用场景。
130 12
|
8月前
|
测试技术 iOS开发
蓝条下压和消失导致页面错乱问题解决方案
蓝条下压和消失导致页面错乱问题解决方案
56 0
|
JavaScript
KindEditor得不到textarea值的解决方法
认真找下原因。 首先描述下我这边KindEditor的错误现象: 1、在IE8/FF下均得不到值; 2、当点击KindEditor的全拼按钮切换到全屏模式输入时,再返回正常模式,可以得到值; 3、我用的是jQuery的点击事件提交表单的,提交,无法得到值; 4、直接用表单的提交按钮 ”提交” 可以得到值。 下面以 KindEditor 4.x 版本为例说明,先贴上正确的代码:
117 0
|
JavaScript 前端开发 算法
JavaScript实现一段时间之后关闭广告
简介:通过JavaScript实现在一段时间之后,广告消失。
140 0
JavaScript实现一段时间之后关闭广告
|
测试技术
软件测试面试题:遇到alert弹出窗如何处理?
软件测试面试题:遇到alert弹出窗如何处理?
509 0
|
存储 编译器 Linux
自义定类型详解——十分钟杀穿类型对齐机制
正片开始👀 结构大小👏 我们先随便给出一个结构体,为了计算他的大小,我给出完整的打印方案:
自义定类型详解——十分钟杀穿类型对齐机制