禁用按钮

本文关键字:按钮 | 更新日期: 2023-09-27 18:11:50

我想防止用户在按钮已经执行并且过程尚未完成时两次单击按钮。

我正在使用紧凑的框架3.5,我有问题,当用户点击两次按钮,已经执行或其他一些按钮。我想在程序执行时禁用所有按钮,并在进程完成时再次启用它们。

操作系统:Windows mobile 6.1
框架:.NET 3.5 CF

禁用按钮

尝试添加这个。Enabled = false在Click处理程序范围内的第一件事(这是有问题的表单)。完成后,请确保将其设置为true。如果这些都在处理程序的范围内,您可能需要使用Application.DoEvents()或Update()来显示可见的进度。也许做任何扩展处理的首选方法是生成一个后台线程,并使用Invoke和BeginInvoke从它更新你的UI。

我发现在构建windows移动应用程序时经常需要这样做,所以我做了一个简单的实用程序类。

public static class FormUtility
{
    /// <summary>
    /// Lock the form whilst processing
    /// </summary>
    /// <param name="controlCollection"></param>
    /// <param name="enabled"></param>
    public static void FormState(Control.ControlCollection controlCollection, bool enabled)
    {
        foreach (Control c in controlCollection)
        {
            c.Enabled = enabled;
            c.Invalidate();
            c.Refresh();
        }
    }
 }

我所需要做的就是调用一行代码来锁定表单。

FormUtility.FormState(this.Controls, false);

你应该以

结尾
 private void btnSave_Click(object sender, EventArgs e)
 {
      FormUtility.FormState(this.Controls, false);
      //Do your work
      if (!SaveSuccessful())
           //Renable if your validation failed
           FormUtility.FormState(this.Controls, true);
 }

编辑:我认为@tcarvin建议的是,你不需要在每个控件上调用刷新,而只是使控件无效,然后刷新容器,这将导致所有无效的控件立即重新绘制。我还没有测试过这个,但一个小的变化,如…

    public static void FormState(Form form, bool enabled)
    {
        foreach (Control c in form.Controls)
        {
            c.Enabled = enabled;
            c.Invalidate();
        }
        form.Refresh();
    }

然后使用

FormUtility.FormState(this, true);

这是最简单的方法,对于一个名为button1的按钮:

void button1_Clicked(object sender, EventArgs e) {
  button1.Enabled = false;
  try {
    // put your code here
  } finally {
    button1.Enabled = true;
  }
}