WinForm中设置Enabled=False为什么还会响应Click事件

阅读: 评论:0

WinForm中设置Enabled=False为什么还会响应Click事件

WinForm中设置Enabled=False为什么还会响应Click事件

示例代码

using System;
using System.Threading;
using System.Windows.Forms;namespace ClickDemo
{public partial class Form1 : Form{private string text = "";public Form1(){InitializeComponent();}private void button_Click(object sender, EventArgs e){print(1,true);setEnable(false);print(2);Thread.Sleep(2000);print(3);setEnable(true);print(4);}private void setEnable(bool enable){this.button.Enabled = enable;}private void print(int num,bool isPrint = false){if (isPrint){text += "rn---------------------------------";}text += $"rn{DateTime.Now} button state{num}: {this.button.Enabled}";Box.Text = text;}private void btnClear_Click(object sender, EventArgs e){text = "";Box.Text = text;setEnable(true);}}
}

大家从button_Click事件中应该明白笔者所想要验证的内容,不错,就是在进入Click事件的时候让这个按键不可点击,但是上面的实现貌似不能解决问题。

运行效果

结果分析

以上的结果是笔者连续点击button后的运行结果,明明是想只运行一次,为什么触发了这么多次,从输出的log上来看明显是正常的啊。难道button设置Enabled=False后还可以点击不成,其实不是,事实上它根本没有上来就执行 setEnable(false),看最后一句log,为什么不是紧跟着状态变为False的呢。大家可以实际演示一下,代码就在上面,从打印的内容上可以发现,它是在耗时操作执行完以后才设置的False

这是因为消息机制引起的问题,如果处理click事件的函数执行时间过长,那么下一次点击的消息会存入消息队列,等到当前click处理函数退出以后,再从消息队列获取此消息执行。你可以使用笔者提供的代码,多次点击button,你会看到多次的重复执行。

解决此问题可以使用异步调用等完成后回调。

解决方法

button_Click事件内容改成如下所示

   private void button_Click(object sender, EventArgs e){print(1, true);setEnable(false);print(2);new Thread(() =>{Thread.Sleep(2000);this.BeginInvoke(new Action(() =>{print(3);setEnable(true);print(4);}));}).Start();}

再次多次点击按钮,运行的效果就和期望的一致了。

本文发布于:2024-02-03 04:03:21,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170690420248527.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:还会   事件   Enabled   WinForm   Click
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23