Отключить кнопку - PullRequest
       22

Отключить кнопку

2 голосов
/ 21 октября 2011

Я хочу, чтобы пользователь дважды не нажимал на кнопку, когда она уже выполняется и процесс не завершен.

Я использую Compact Framework 3.5, и у меня возникают проблемы, когда пользователь нажимает два раза на кнопку, которая уже выполняется, или какую-либо другую кнопку.Я хочу отключить все кнопки во время выполнения программы и снова включить их, когда процесс завершится.

ОС: Windows Mobile 6.1
Framework: .NET 3.5 CF

Ответы [ 3 ]

3 голосов
/ 21 октября 2011

Попробуйте сначала добавить this.Enabled = false (это рассматриваемая форма) в область действия вашего обработчика Click. Не забудьте установить его обратно в true, когда закончите. Вам может потребоваться Application.DoEvents () или Update () для отображения видимого прогресса, если все это находится в области действия обработчика. Вероятно, предпочтительным способом выполнения какой-либо расширенной обработки будет порождение фонового потока и обновление вашего пользовательского интерфейса из него с помощью Invoke и BeginInvoke.

2 голосов
/ 21 октября 2011

Я обнаружил, что мне нужно было делать это довольно часто при создании приложения для 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);
0 голосов
/ 21 октября 2011

Это самый простой способ для кнопки с именем button1:

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