Winform方面的问题,如何在validating事件中,了解用户是关闭窗体所执行的validating?

hwyqy 2016-10-13 11:01:13
说点题外话吧,大概在10年前,实现过这个功能,结果电脑被偷了,这个功能刚实现没多长时间,也没备份。那时候不像现在,到处都是云存储。
现在又想到这个问题,就是我在validating事件中编写代码,如果代码通不过,提示信息。但是如果用户因点击关闭窗体按钮而导致validating,则不验证。
不然的话,用户会很奇怪,点击关闭窗体,结果先出现一个消息框,”未通过验证“,然后窗体才关闭。

代码如下:
control_validating(s,e)
{
if (!FormClosing()) Validate();
}

隐约记得FormClosing是使用API读取windows消息队列,找到有WM_Close消息来判断的,现在写不出这个代码了

各位大虾,能够帮忙看看,怎么实现FormClosing方法。
...全文
279 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
圣殿骑士18 2016-10-14
  • 打赏
  • 举报
回复
引用 3 楼 HtoFire 的回复:
[quote=引用 2 楼 crystal_lz 的回复:] 按照常理来说 validating 肯定是先在 close 之前发生的 你把你的动作放慢来看 首先 焦点在文本框里面 然后你去点击 关闭 那么肯定文本框的失去焦点 然后去触发关闭按钮 既然要先失去焦点 那么就会执行validating而此时 windows还并不知道 你的下一步是关闭窗体 还是去点击其他按钮 所以在validating是无法判断是因为关闭窗体而触发的还是 失去焦点而触发的 但是你可以换一个做法 为什么一定要弹框这种不友好不方便并且又霸道的方式 你大可直接 放一个label来提示 或者 验证不通过将文本框颜色换成黄色以表示警告 这样的话 别人关闭窗体的时候 文本框在那一瞬间变成黄色也没啥 也符合不通过验证的逻辑
感谢,我已经是用tooltip之类提示了,实际上不存在我说的场景,但是一直想得到原来的那种技巧,也算是对技术的精益求精吧 经过测试,重写窗体的WndProc方法,能够在validating前截获WM_Close消息,如果我的代码不是在组件中,是可以实现的 但问题是,我的代码在组件中,无法重写窗体的WndProc方法,该怎么办呢?(原来我使用的,应该是使用api,通过窗体的hwnd来监听WM_Close消息,唉,已经忘了怎么写的了,而且现在少尽量少用api实现。)[/quote] 要把代码移形换位,当然是用委托+事件了,可以把WndProc中用的一部分代码,在组件中实现。并没有问题。
圣殿骑士18 2016-10-14
  • 打赏
  • 举报
回复
应该没什么方便的办法。但有个比较繁琐的方法,就是放弃winform确定的这种机制,由你自己触发校验。
方法:”
1、建立一个主键MyTextBox,在其中屏蔽原生的Validation,并建立另外一个Validation的方法(手动调用的)

2、使用MyTextBox替换TextBox
3、自己控制校验时机
hwyqy 2016-10-13
  • 打赏
  • 举报
回复
引用 2 楼 crystal_lz 的回复:
按照常理来说 validating 肯定是先在 close 之前发生的 你把你的动作放慢来看 首先 焦点在文本框里面 然后你去点击 关闭 那么肯定文本框的失去焦点 然后去触发关闭按钮 既然要先失去焦点 那么就会执行validating而此时 windows还并不知道 你的下一步是关闭窗体 还是去点击其他按钮 所以在validating是无法判断是因为关闭窗体而触发的还是 失去焦点而触发的 但是你可以换一个做法 为什么一定要弹框这种不友好不方便并且又霸道的方式 你大可直接 放一个label来提示 或者 验证不通过将文本框颜色换成黄色以表示警告 这样的话 别人关闭窗体的时候 文本框在那一瞬间变成黄色也没啥 也符合不通过验证的逻辑
感谢,我已经是用tooltip之类提示了,实际上不存在我说的场景,但是一直想得到原来的那种技巧,也算是对技术的精益求精吧 经过测试,重写窗体的WndProc方法,能够在validating前截获WM_Close消息,如果我的代码不是在组件中,是可以实现的 但问题是,我的代码在组件中,无法重写窗体的WndProc方法,该怎么办呢?(原来我使用的,应该是使用api,通过窗体的hwnd来监听WM_Close消息,唉,已经忘了怎么写的了,而且现在少尽量少用api实现。)
crystal_lz 2016-10-13
  • 打赏
  • 举报
回复
按照常理来说 validating 肯定是先在 close 之前发生的 你把你的动作放慢来看 首先 焦点在文本框里面 然后你去点击 关闭 那么肯定文本框的失去焦点 然后去触发关闭按钮 既然要先失去焦点 那么就会执行validating而此时 windows还并不知道 你的下一步是关闭窗体 还是去点击其他按钮 所以在validating是无法判断是因为关闭窗体而触发的还是 失去焦点而触发的 但是你可以换一个做法 为什么一定要弹框这种不友好不方便并且又霸道的方式 你大可直接 放一个label来提示 或者 验证不通过将文本框颜色换成黄色以表示警告 这样的话 别人关闭窗体的时候 文本框在那一瞬间变成黄色也没啥 也符合不通过验证的逻辑
hwyqy 2016-10-13
  • 打赏
  • 举报
回复
引用 楼主 HtoFire 的回复:
说点题外话吧,大概在10年前,实现过这个功能,结果电脑被偷了,这个功能刚实现没多长时间,也没备份。那时候不像现在,到处都是云存储。 现在又想到这个问题,就是我在validating事件中编写代码,如果代码通不过,提示信息。但是如果用户因点击关闭窗体按钮而导致validating,则不验证。 不然的话,用户会很奇怪,点击关闭窗体,结果先出现一个消息框,”未通过验证“,然后窗体才关闭。 代码如下: control_validating(s,e) { if (!FormClosing()) Validate(); } 隐约记得FormClosing是使用API读取windows消息队列,找到有WM_Close消息来判断的,现在写不出这个代码了 各位大虾,能够帮忙看看,怎么实现FormClosing方法。
另外,我写的是个组件,所以无法重写窗体的wndproc方法

111,120

社区成员

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

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

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