禁用按钮

时间:2011-10-21 10:20:56

标签: c# windows-mobile compact-framework

我希望阻止用户在按钮上执行两次单击并且该过程尚未完成。

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

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

我发现在构建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建议的是你不需要在每个控件上调用refresh,而只是使控件无效,然后刷新容器,这将导致所有无效的控件一次重绘。我没有对此进行过测试,只是对......之类的小改动进行了测试。

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

答案 2 :(得分:0)

对于名为button1的按钮:

,这是最简单的方法
void button1_Clicked(object sender, EventArgs e) {
  button1.Enabled = false;
  try {
    // put your code here
  } finally {
    button1.Enabled = true;
  }
}