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