c#编程中发现了Button一个很奇怪的问题!似乎是控件本身BUG!

highfly2008 2008-12-21 11:49:03
代码如下:
private void myButton1_Click(object sender, EventArgs e)
{
myButton1.Enabled = false;
MessageBox.Show("已经执行");

Thread.Sleep(5000);

myButton1.Enabled = true;
}
在第一次弹出对话框后,再次点击已经被设置为Enabled = false;的Button按钮,过一会延时结束后又会弹出一个
对话框。(也就是说当我把Buootn设置为不可用之后点击他,还是引发了他的Click事件。)
不知那位高人指点指点!

...全文
499 52 打赏 收藏 转发到动态 举报
写回复
用AI写文章
52 条回复
切换为时间正序
请发表友善的回复…
发表回复
lonely00 2011-02-26
  • 打赏
  • 举报
回复
今天我做程序的时候也碰到这个问题了,感觉只有多线程技术才可以解决这个问题!
持续关注中·······
gtiroy 2008-12-22
  • 打赏
  • 举报
回复
你点击一次,他会先执行完触发的事件。

再处理其他事件。你的事件最后让按钮已经可用了。所以。。。就再次触发了。

不是bug是思路不对。
535cheng110 2008-12-22
  • 打赏
  • 举报
回复
用多线程
xskj0525 2008-12-22
  • 打赏
  • 举报
回复
VS08不会 不代表C#代码不会呀 呵呵 代码都差不多`~
winsei 2008-12-22
  • 打赏
  • 举报
回复
VS08不会哦。
qinqinhao 2008-12-22
  • 打赏
  • 举报
回复
mark
Hesperus 2008-12-22
  • 打赏
  • 举报
回复
回帖是一种美德!传说每天回帖即可获得 10 分可用分!
SlaughtChen 2008-12-22
  • 打赏
  • 举报
回复
顶一个
xxyping 2008-12-22
  • 打赏
  • 举报
回复
private void myButton1_Click(object sender, EventArgs e)
{
myButton1.Enabled = false;
MessageBox.Show("已经执行");

Thread.Sleep(5000);

myButton1.Enabled = true; }

myButton1.Enabled = false;

个人认为这句代码在CliCK事件还没结束前是没什么作用的,整个事件结束之后它才能生效。也就是说你虽然表面上看它是false的。其实它也是可以点的。就想楼上有人说的那样,只不过是没刷新而已。看来看去只有用多线程才是最好的解决方法
wengjj1985 2008-12-22
  • 打赏
  • 举报
回复
学习下,以前也想要完成一个类似的问题,但后来怎么解决的要带具体代码,等看完资料在大家讨论下
洋溢2020 2008-12-22
  • 打赏
  • 举报
回复
不知道
Thread.Sleep(5000);
效果所致,
夏脑 2008-12-22
  • 打赏
  • 举报
回复
private void myButton1_Click(object sender, EventArgs e)
{
myButton1.Enabled = false;
MessageBox.Show("已经执行");

Thread.Sleep(5000);

myButton1.Enabled = true; }
代码的问题,你对比看一看红色的地方,
lqscoke 2008-12-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 FuqianZhao 的回复:]
个人感觉是这样;Thread.Sleep(5000)的时候整个消息响应线程都sleep了, 你点击的消息没有从消息队列里取出来,sleep结束 enable属性设置为true之后第二次click消息才被响应
[/Quote]
我感觉也是这样的
taz01 2008-12-22
  • 打赏
  • 举报
回复
已经测试了 没出现楼主所说的情况
悔说话的哑巴 2008-12-22
  • 打赏
  • 举报
回复
关注
wangfei19781125 2008-12-22
  • 打赏
  • 举报
回复
mark
lovelan1748 2008-12-22
  • 打赏
  • 举报
回复
mark
gsmlove 2008-12-22
  • 打赏
  • 举报
回复
mark
highfly2008 2008-12-21
  • 打赏
  • 举报
回复
我重新封装了一个Button,重写了WndProc方法捕获点击左键还是不行,但我发现给“if (this.Enabled == false)
”设置断点后调试中就不会重新触发。一直行后又是一样
private const int WM_LBUTTONDOWN = 0x201;
protected override void WndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case WM_LBUTTONDOWN:
if (this.Enabled == false)
return;
default:
break;
}
base.WndProc(ref m);
}
net5i 2008-12-21
  • 打赏
  • 举报
回复
搂主这是没问题的呀!
private void myButton1_Click(object sender, EventArgs e)
{
myButton1.Enabled = false;
MessageBox.Show("已经执行");

Thread.Sleep(5000);

myButton1.Enabled = true; //这里已经是可用了,再次点击肯定会触发事件了,只不过这个时候界面上的可用状态还没有完全刷新过来,你就再次点击了
}
加载更多回复(32)

111,130

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧