Отключить кнопку
Я хочу, чтобы пользователь не нажимал два раза на кнопку, когда она уже была выполнена и процесс не завершен.
Я использую compact framework 3.5, и у меня возникают проблемы, когда пользователь нажимает два раза на кнопку, которая уже выполняется, или на какую-то другую кнопку. Я хочу отключить все кнопки, когда программа выполняется, и включить их снова, когда процесс завершен.
ОС: Windows mobile 6.1
Фреймворк: .NET 3.5 CF
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.