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


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

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

ОС: Windows mobile 6.1
Фреймворк: .NET 3.5 CF

3 2

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

EDIT: я думаю, что @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);

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

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

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