c#中禁用一个 Button 按钮后,点击按钮为什么仍然会有效?

c#中禁用一个 Button 后,为什么点击仍然会有效? 

也就是说,在 Button 禁用状态下,仍然会发 windows 消息给 Form。

例如,点击第一次时,将 Button.Enabled 设置为 false,设置后,再点击2次。
执行结果是:Button 被点击了3次,事件被执行了3次。而且是,按顺序执行的。

这种执行结果,跟之前对 Button.Enabled 属性的理解,完全不一样。

我的程序中:
1、使用了一个子线程(STA线程),初始化一个 Form,上面放了一个 Button
2、点击 Button 后,需要执行一段计算,所以将 Button 设置为禁用(灰色)
3、结果是:首次点击 Button 后,在禁用的状态下,再点击2次,最终却执行了 3 次计算(按钮事件)

在button点击代码中,第一行代码就把enabled设为false
如果是这样写的,你说的这种情况不应该出现

1、如果在點擊一次之後按鈕沒有為灰色,那麼是按鈕的enabled设为false沒有放對未知,應該放在點擊事件的最後一行。
2、如果在點擊一次之後按鈕是灰色,但是還能進行操作,那麼就是你的單擊事件針對全局了。

点击事件消息排队,原因是你的程序出现了主线程阻塞情况,系统会记录你的点击事件,等程序响应回来后,继续后续的点击事件。

在你代码里加上一个bool变量,开始结束分别设置为true false,遇到true说明正在执行,return,防止事件代码重入

已经加过了,没有效果。

因为点击按钮的动作,并不是同步的,而作为消息队列,被排在了后面。等当前事件执行完,就会跟着执行。

至于为什么禁用后的按钮,点击会产生事件消息,还在测试中。可能跟上面的文章问题类似。

你把禁用button放到线程启动了吧?建议放到单击事件第一行

你代码逻辑有问题吧?

onclick(...)
{
   btn.enabled = false;
   dosomething();
   // 加个sleep看看,是不是代码短,执行快,
   // 在你第二次单击之前enabled就被恢复过来了?
   sleep(5);
   btn.enabled = true;
}

楼主可能在其他线程执行了 Enabled = false,而在当前线程执行了 Click 事件。如果二者在同一线程不可能出现小蜜蜂论坛顶帖机这种结果。
Windows 这么多年了,微软不可能犯这种错误。

你要把处理的事件放到线程里或者异步,防止堵塞主线,

已解决!就是线程被阻塞的原因。

执行过程如下:
1、窗体本身就在子线程创建,所以消息队列也由子线程维护和使用。
2、由于执行计算代码时,阻塞了子线程,所以消息没有得到处理。
3、计算代码执行完成后,原代码中马上把按钮恢复为可用。
4、之后线程空闲期间,消息得到处理,这里按钮被再次按下。最终导致计算代码重复执行。

通过此问题的解决,可理解如下:
1、消息本身跟按钮是否禁用,没有关系。windows只负责把点击屏幕某一块的消息分发给进程或线程(具体内部实现不清楚)。
2、而线程在处理消息时,才会判断所点击的区域(按钮)是否为禁用状态,如果禁用则忽略消息。
3、阻塞线程这个,确实不容易发现。如果不了解 windows form 的消息机制,几乎没有办法发现。

发布了74 篇原创文章 · 获赞 0 · 访问量 3090

猜你喜欢

转载自blog.csdn.net/netyou/article/details/104407853