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 += "\r\n---------------------------------";
            }
            text += $"\r\n{DateTime.Now} button state{num}: {this.button.Enabled}";
            this.textBox.Text = text;
        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            text = "";
            this.textBox.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();
        }

再次多次点击按钮,运行的效果就和期望的一致了。
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值