【问题标题】:Disable a button禁用按钮
【发布时间】:2011-12-12 11:31:08
【问题描述】:

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

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

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

【问题讨论】:

标签: c# windows-mobile compact-framework


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      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);
      

      【讨论】:

      • 您真的发现每个控件都需要刷新吗?我认为您可以将 Refresh 发送给父级,所有无效的控件都会被刷新。
      • 是的,好点。我的大多数移动表单都非常简单,只有几个控件,所以我从未注意到任何真正的性能问题。感谢您的提示。
      • 谢谢你的回答。 tcarvin 你所说的partent 是什么意思?你能给我解释一下吗?
      • 使用@tcarvin 的建议添加了一个替代方案
      猜你喜欢
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 2018-07-05
      • 2011-06-13
      • 2019-03-30
      相关资源
      最近更新 更多