我在Picturebox1上点了一下鼠标,PictureBox1_MouseDown 却执行了两次,很疑惑而且,并不是每次都执行2次,大多数时候执行1次,偶尔执行2次。bool mousedown;
public void try ()
{  
    PictureBox1.MouseDown += new MouseEventHandler(PictureBox1_MouseDown);            
    //循环等待鼠标事件发生
    while (false == mousedown)
       Application.DoEvents();
    mousedown = false;            
}
public void PictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    PictureBox target = (PictureBox)sender;
    target.MouseDown -= PictureBox1_MouseDown;                  
    mousedown = true;            
}
public void Play()
{         
    mousedown = false;   
    for (int i = 0; i < 10; i++)
    {
        try ();
        其他操作
     }
}另外,我想让发生鼠标事件之后在执行一些操作,所以我用
while (false == mousedown)
       Application.DoEvents();
检测是否发生鼠标事件,不知是否合适?

解决方案 »

  1.   

    target.MouseDown -= PictureBox1_MouseDown;
    鼠标事件发生后我立即去掉了事件,应该不是鼠标的问题吧。 
      

  2.   

    不明白你为什么要这么写
    估计是委托链的问题你将
    PictureBox1.MouseDown += new MouseEventHandler(PictureBox1_MouseDown); 
    执行两遍他就会在你点一下鼠标时触发两次你的回调函数,也没有必要使用
    //循环等待鼠标事件发生 
        while (false == mousedown) 
          Application.DoEvents(); 
    来等待,其实在你注册事件后系统本身也不会停下来另外,我想让发生鼠标事件之后在执行一些操作,所以我用 
    while (false == mousedown) 
          Application.DoEvents(); 
    检测是否发生鼠标事件,不知是否合适?直接放在PictureBox1_MouseDown函数里不就可以么?
      

  3.   

    jch1983 你说得对,我这才发现PictureBox1.MouseDown += new MouseEventHandler(PictureBox1_MouseDown)
    的确执行了2次,太感谢了!!
    还有,我那个循环,只有鼠标点击了Picturebox1以后才可以继续执行,否则程序等待,
    应该怎么写呢??能否用代码详细说明一下??谢了。
      

  4.   

    直接把要执行的代码放到
    public void PictureBox1_MouseDown(object sender, MouseEventArgs e) 

                  

    里就可以
    程序等待不用你自己控制
      

  5.   

    PictureBox1_MouseDown改为PictureBox1_clientclick试试