Запрещение пользователю нажимать определенную кнопку во время выполнения действия - PullRequest
0 голосов
/ 14 марта 2012

Вот сценарий:
Платформа: Windows
IDE: Microsoft Visual Studio 2008
Язык: C #
.NET Framework: 3,5

Мое приложение содержит 2 buttons -«Загрузить данные» и «Прекратить загрузку данных» и multi-line textbox.После нажатия «Загрузить данные» button некоторые данные начинают загружаться в textbox.Чтобы пользователь не нажимал на «Загрузить данные» button несколько раз, я отключил этот button после его нажатия.Когда все данные загружаются в textbox, тогда «Load Data» button снова активируется.С другой стороны, при нажатии «Остановить загрузку данных» button загрузка данных прекращается (если пользователь желает остановить ее перед загрузкой всего содержимого).
Как указано ранее, чтобы пользователь не нажимал «Загрузить»Данные "button несколько раз, я отключил этот button с намерением, чтобы пользователь мог только нажать" Остановить загрузку данных "button или дождаться загрузки всех данных в textbox.Я реализовал это.На первый взгляд, это, кажется, работало хорошо.Но во время тестирования я обнаружил, что хотя «Загрузка данных» button отключена, если пользователь нажимает на этот button, хотя в этот момент ничего не происходит, но как только все данные загружаются и button становитсяснова включен, тот щелчок, сделанный во время отключенного состояния, считается выполненным.Как будто программа записывала нажатия клавиш и щелчки мыши и ждала, когда кнопка снова станет активной.Но в моей программе нет таких средств записи нажатий клавиш или щелчков мышью.Что вызывает такую ​​активность?Как я могу предотвратить такое поведение?

Спасибо.

Ответы [ 5 ]

3 голосов
/ 14 марта 2012

Один из вариантов будет работать с часовым стражем:

Вы можете определить поле int (инициализировать с 0) и обновить его с помощью Interlocked.Increment при вводе методаи продолжайте, только если оно равно 1. В конце просто выполните Interlocked.Decrement.

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

Кстати: долгосрочные задачи должны выполняться асинхронно (например, через отдельный поток) ...

0 голосов
/ 14 марта 2012

Ну, еще раз:

В начале загрузки просто спрячьте кнопку load и вместо нее, скажем, покажите индикатор выполнения.По окончании загрузки или при нажатии stop loading снова нажмите кнопку load.В этом случае вы избегаете управления «цепными щелчками», на которое жалуетесь.

Или управляете кнопкой одна Сначала это load, по клику вместо этого становится stop load.Такое решение вы бы часто находили в мобильной среде, учитывая ограниченное пространство экрана.Но я думаю, что это может быть применено к рабочему столу также с большим успехом.Почему нет?

0 голосов
/ 14 марта 2012

Держу пари, что вы не можете даже переместить форму, пока данные не загружены, и вы также не можете остановить загрузку данных. Проблема в том, что вся форма зависает до завершения загрузки. Вы должны переместить загрузочную часть в отдельном потоке.

0 голосов
/ 14 марта 2012

Проверьте это сообщение:

http://www.codeguru.com/forum/showthread.php?t=480279

Моей первой мыслью было удаление обработчика события и его повторное связывание в конце события click. Этот поток предлагает использовать BackgroundWorker и сделать его асинхронным.

0 голосов
/ 14 марта 2012

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

В противном случае вы бы просто делали метод, который вы уже попробовали, я хотел бы увидеть ваш код для отключенного состояния, потому что что-то говорит мне, что вы только что сделали его отключенным, и он все еще функционировал кнопка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...