C# Winfrom Button 防止重复点击

设置Button的Enabled属性为false,本身没什么错, 有朋友遇到设置了为false的为什么在禁用期间再点击会继续执行,我查了下现有说话是winfrom会有消息排队,结果找到了原因,点击事件消息排队原因是你的程序出现了主线程阻塞情况,系统会记录你的点击事件,等程序响应回来后,继续后续的点击事件。我的情况就是这样。


        private void button1_Click(object sender, EventArgs e)
        {
            当程序进来判断Enabled状态,若是false表示上一次未执行完,
            if (!this.button1.Enabled)
            { return; }
            this.button1.Enabled = false;
            //我将业务放在线程里处理,若不让在线程里,this.button1.Enabled = false;不会有禁止效果,因为本次主线程没有完成。
            Task task = new Task(() =>
             //CheckWebConnection是我执行业务处理,Action是个委托,BeginInvoke好像是将主线程所属方法赋值给子线程,说得不对地方多多包涵。
             new Action(CheckWebConnection).BeginInvoke(null, null)
            );
            task.Start();
        }
  /// <summary>
        /// 验证服务连接是否正确
        /// </summary>
        private void CheckWebConnection()
        {

            try
            {
                //若不加上这一句this.Invoke(new InvokeCallBackDelegate(delegate (){  }));
                //会出现控件不是该线程创建。若你在业务处理方法内需要对界面控件进行操作就需要这句话了
                this.Invoke(new InvokeCallBackDelegate(delegate ()
                {
                    this.errorProvider1.Clear();//这是我界面消息控件内容清空
                }));
                
                   // 业务处理
                   //............................
                   //.......业务处理就不展示了..............
                   //............................
                   //下面是返回给界面信息提示
                    this.Invoke(new InvokeCallBackDelegate(delegate ()
                    {
                        this.m_IsWebConnection = false;
                        this.errorProvider1.SetError(this.label3, "服务器IP或端口号错误!");
                    }));
               

            }
            catch (Exception ex)
            {
            }
            finally
            {
                //最后将button的Enabled  设置ture 可用
                this.Invoke(new InvokeCallBackDelegate(delegate ()
                {
                    this.button1.Enabled = true;
                }));
            }


        }

//最后将button的Enabled  设置ture 可用
                在我程序出现一种情况 this.Invoke(new InvokeCallBackDelegate(delegate ()会报错,出现对象已释放,检查下你是否在有关闭窗口情况,关闭窗口,在finally的时候在关闭窗口,用参数reulst 来判断是否关闭窗口。
                

   finally
            {

                this.Invoke(new InvokeCallBackDelegate(delegate ()
                {
                    this.button1.Enabled = true;
                    if (reulst)
                    {
                            // 对Login窗口的操作
                            this.DialogResult = DialogResult.OK;
                        this.Close();
                    }

                }));


            }

 

C# WinForms 中,可以使用 ProgressBar 控件来实现进度条功能。下面是一个简单的示例代码,演示如何创建和使用进度条: 1. 首先,在你的窗体上添加一个 ProgressBar 控件。你可以在设计视图中直接拖拽该控件到窗体上,或者通过代码动态创建该控件并将其添加到窗体中。 2. 在窗体的代码中,你可以使用 ProgressBar 控件的 Value 属性来设置当前进度的值。通常,该属性的值应介于 Minimum 和 Maximum 之间。你可以通过修改这两个属性来调整进度条的最小和最大值。 3. 若要更新进度条的值,你可以使用 ProgressBar 控件的 Increment 方法来增加当前值。你还可以直接设置 Value 属性来确切指定进度。 下面是一个简单的示例代码,演示如何使用进度条控件: ```csharp using System; using System.Threading; using System.Windows.Forms; namespace ProgressBarExample { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void buttonStart_Click(object sender, EventArgs e) { // 设置进度条的最小值和最大值 progressBar.Minimum = 0; progressBar.Maximum = 100; // 模拟耗时操作 for (int i = 0; i <= 100; i++) { // 更新进度条的值 progressBar.Value = i; // 延迟一段时间,以展示进度条的更新 Thread.Sleep(100); } // 完成后显示消息框 MessageBox.Show("操作已完成!"); } } } ``` 在上面的示例中,我们在按钮的 Click 事件处理程序中模拟了一个耗时操作,并使用进度条控件来展示操作的进度。注意,在实际的应用程序中,你需要根据具体的需求和业务逻辑来更新进度条的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值