Code Bye

关于Button设置Enabled = false后鼠标响应的问题

private void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
textBox1.Text += “在执行中········”;
//process something
textBox1.Text += “执行完毕!”;
button1.Enabled= true;
}
请看以上代码,本人希望达到的效果是,用户点击按钮后,按钮变灰,进程处理完毕后才可以再次点击按钮,在按钮为灰色期间的全部点击动作无效。
但实际的效果是,本人在按钮上不停的点,虽然第一次点击后按钮是变灰了。但是一旦按钮变回以后还是会继续响应按钮变灰后的点击动作,原因是按钮变灰后的点击动作被缓存起来了,按钮变回以后继续响应缓存的点击动作。假如本人连续在按钮上点几十下,界面得几分钟才能缓过来。
问一下这个问题该怎么样解决。
原因是process something执行的是界面绘图操作,所以无法用异步方式处理。
解决方案

30

        int num = 0;
        private void button1_Click(object sender, EventArgs e)
        {
            this.button1.Enabled = false;
            Thread.Sleep(2000);
            num++;
            this.textBox1.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff   "+ num);
            //加上下面这句,没这句你的界面不会重回,你按钮的Enable设置没能更新到界面上
            //也就是你以为你的按钮被禁用了,其实在你整段代码运行结束之前都不会被禁用
            Application.DoEvents(); 
            this.button1.Enabled = true;
        }

5

引文你的process something是使用另外一个进程在处理,所以当你调用进程的Start方法后,你的主线程就会继续开始执行()不会被阻塞住),后面的  textBox1.Text += “执行完毕!”;和button1.Enabled= true;也会执行。所以很有可能你的处理线程一开始你的按钮就Eable了,只是界面显示稍微慢了点。你应该在确认处理线程执行完毕之后再回复按钮为可用状态。

5

你应该在process something完成之后通知textBox1.Text += “执行完毕!”;button1.Enabled= true;

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于Button设置Enabled = false后鼠标响应的问题