如何禁用和启用点击接收...?

时间:2015-03-09 11:28:45

标签: c#

我想将MouseEventArgs重置为始终只运行一次。 如果有人多次单击该按钮(10次),则程序运行10次,依此类推。

我的代码效果不佳,因为如果有人点击按钮1次,则会运行2次或更多次。 我想重置MouseEventArgs或做其他解决方案。

Windows窗体应用程序(XP,32位)

    private void button1_MouseClick(object sender, MouseEventArgs e)
    {

        button1.Enabled = false;
        button1.MouseClick -= button1_MouseClick;
        mc++;


        if (true)
        {
            button1.Enabled = false;
            //button1.Location = new Point(40, 40);
            //Point location = button1.Location;
            //location.X = 0; location.Y = 0;
            System.Threading.Thread.Sleep(2000);
            if (mc == 1)
            {

                //button1.Location = new Point(67, 191);
                //location.X = 67; location.Y = 191;
                mc = 0;
                button1.Enabled = true;
                button1.MouseClick += button1_MouseClick;

                textBox1.AppendText("Click " + e.Clicks + ", Clicks: " + mc + "\n");

            }
        }
    }

3 个答案:

答案 0 :(得分:1)

您正尝试在主线程上执行一些长时间运行的作业。 看起来您可能看起来禁用了按钮,但应忽略后续点击,但它们实际上已放入队列中。如果你看一下事件队列,那么当按钮被启用时,每次点击都会完成:

Click
Disable button
Wait 2 seconds
Enable button
Click
...

请尝试以下代码:

private void button1_MouseClick(object sender, MouseEventArgs e)
{
        //disable button on main thread
        button1.Enabled = false;

        Thread worker = new Thread(() =>
        {
           //do time consuming job
           System.Threading.Thread.Sleep(2000);

           //enable button (from the main thread)
           this.Invoke((MethodInvoker)delegate
           {
              textBox1.AppendText("Click " + e.Clicks + "\n");
              button1.Enabled = true;
           });
        });

        worker.Name = "Button 1 worker";
        worker.Start();
}

现在,耗时的工作在单独的线程上完成,UI事件将按预期工作:

Click
Disable button
Do job on another thread ------------> Wait 2 seconds
Click - ignored (button is disabled)        |
Click - ignored (button is disabled)        |
Click - ignored (button is disabled)        |
Click - ignored (button is disabled)        |                                                    
                                       Enable button
Click
Disable button ...

答案 1 :(得分:0)

不是在事件中编写逻辑,而是尝试创建一个扩展System.Windows.Forms.Button的自定义控件。

但据我所知,你的代码会让你点击事件处理程序总是与函数链接,如果mc值以0开头。

希望有所帮助

答案 2 :(得分:0)

当您禁用按钮时,可能无法再接收任何鼠标事件,因此您无需更改任何事件处理程序。编写应在处理程序中执行一次的代码并禁用该按钮。因此,只要按钮被禁用,代码就不能再执行了。