在form 的activated event 里面使用messagebox的问题

blucecat 2004-03-25 11:00:29
一段最简单的代码:
private void Form1_Activated(object sender, System.EventArgs e)
{
MessageBox.Show("ABC");
}


为什么运行后点messagebox的确定按钮messagebox会反复弹出?谢谢回答!
...全文
40 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
blucecat 2004-03-29
  • 打赏
  • 举报
回复
sumtec(Psydian) :
实在对不起,都怪我没说清楚,这下对了,非常感谢你的不厌其烦
sumtec 2004-03-28
  • 打赏
  • 举报
回复
晕!你完全没有搞清楚什么是Active,Active是激活的意思!如果你只想第一次加载的时候显示对话框,那么就应该用Load事件,如果你想在显示出来的时候弹出对话框,那就应该用VisibleChanged事件。

你本身的问题没有问清楚,又用错东西了,那我回答的也自然不是你想要的咯。

你应该仔细研究一下,Form有一些什么事件,分别是什么意思,不要随便乱用。
blucecat 2004-03-28
  • 打赏
  • 举报
回复
我没断章取义呀,只是你起初的代码没有this.Activate()嘛
现在对了,不用什么this.focus了
busyActivating = false;这句还是应该去掉,否则在form第二次actived的时候,messagebox又会弹出,这是我不想看到的
blucecat 2004-03-25
  • 打赏
  • 举报
回复
最后一句busyActivating = false;必须删掉,否则busyActivating毫无作用

现在的问题是MessageBox.Show("ABC")后点确定form居然要失去焦点,我不得不在这之后加一句this.focus();这样的效果真是糟透了(form会非常厉害的闪烁一下)
blucecat 2004-03-25
  • 打赏
  • 举报
回复
非常谢谢 sumtec(Psydian) :
我是想在from显示出来后给一个messagebox,我觉得应该是在这个事件里面实现,form got focus应该是Enter event吧?
要实现我的想法没有其他办法了吗?
sumtec 2004-03-25
  • 打赏
  • 举报
回复
不知道你是想验证Activated是否可用呢?还是就是要弹出一个对话框?如果非要弹出一个对话框,那么:
private bool busyActivating;
private void Form1_Activated(object sender, System.EventArgs e)
{
// 这几句话放在开头
if (busyActivating)
{
return;
}
busyActivating = true;

// 其它的什么代码(不弹出窗口)
...

// 凡是弹出窗口的地方,加上下面这两句话。
MessageBox.Show("ABC");
Application.DoEvents();

// 这句话放在最后面
busyActivating = false;
}

sumtec 2004-03-25
  • 打赏
  • 举报
回复
当然,因为你弹出了MessageBox,这个窗口就失去焦点了,等你点“确定”之后,窗口再次被激活,于是就再次进入这个事件,然后再次弹出MessageBox……
sumtec 2004-03-25
  • 打赏
  • 举报
回复
好了,这个经过测试的了,你自己是一下吧,敬请完全拷贝,不要漏了任何一句,尤其是DoEvents();

private bool busyActivating;
private void Form1_Activated(object sender, System.EventArgs e)
{
// 这几句话放在开头
if (busyActivating)
{
return;
}
busyActivating = true;
this.Activate();

// 其它的什么代码(不弹出窗口)
// 这个例子就不写什么罗嗦的代码了。

// 凡是弹出窗口的地方,加上下面这两句话。
MessageBox.Show("ABC");
Application.DoEvents();

// 再弹出一次,保证没问题!
MessageBox.Show("123");
Application.DoEvents();

// 这句话放在最后面
busyActivating = false;
}
sumtec 2004-03-25
  • 打赏
  • 举报
回复
楼主:
请你仔细看看我给你的代码,我想你很可能是断章取义了。你在MessageBox后面没有写Application.DoEvents(); 吧?后面的那个busyActivating = false; 是必需的,否则下一次选中这个窗口就不会显示对话框了!

我想你可能遇到的另外一个问题是,第一次显示这个窗口的时候会失去焦点,这个问题可能是.NET Framework的一个瑕疵,这个问题我在研究一下。
jkflyfox 2004-03-25
  • 打赏
  • 举报
回复
如果只想验证一次Activated事件,可以
private bool bFlag=true;
private void Form1_Activated(object sender, System.EventArgs e)
{
if( bFlag==true)
{
DialogResult dr=MessageBox.Show("Good");
if(dr==DialogResult.OK) bFlag=false;
}
}
不过也会点确定后窗口失去焦点,如楼上所说。要加thi.Focus();
jkflyfox 2004-03-25
  • 打赏
  • 举报
回复
如果是开始时显示一次,load事件就可以的。
如果要获得焦点就显示,Enter事件好像不行。

110,571

社区成员

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

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

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