Как отключить ячейку кнопки в сетке данных WinForms? - PullRequest
2 голосов
/ 17 сентября 2008

У меня есть приложение WinForms с элементом управления DataGridView и столбцом ячеек DataGridViewButtonCell внутри него. Когда я нажимаю одну из этих кнопок, она запускает фоновую задачу, и я хочу отключить кнопки, пока эта задача не будет завершена.

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

Бонусные баллы за метод, который позволяет мне отключать кнопки по отдельности, чтобы я мог оставить одну из кнопок включенной во время выполнения задачи. (Обратите внимание, что я не могу выдавать бонусные баллы.)

Ответы [ 2 ]

3 голосов
/ 17 сентября 2008

Вот лучшее решение, которое я нашел до сих пор. В этой статье MSDN приведен исходный код класса ячейки, в который добавлено свойство Enabled.

Работает достаточно хорошо, но есть две ошибки:

  1. Вы должны сделать недействительной сетку после установки свойства Enabled для любых ячеек. Это показывает, что в примере кода, но я пропустил это.
  2. Это только визуальное изменение, установка свойства Enabled фактически не включает и не отключает кнопку. Пользователь все еще может нажать на него. Я мог проверить свойство enabled перед выполнением события щелчка, но оно также, казалось, портило внешний вид, когда пользователь нажимал на него. Вместо этого я просто отключил всю сетку. Это хорошо работает для меня, но я бы предпочел метод, который позволяет мне отключать некоторые кнопки без отключения всей сетки.

Подобный пример есть в FAQ по DataGridView .

1 голос
/ 17 сентября 2008

Вы можете попробовать:

При нажатии на ячейку ...

  1. Проверьте, запущен ли процесс с текущим идентификатором строки из списка на уровне класса; если это так, выйдите из события щелчка ячейки.
  2. Сохранить идентификатор строки в списке запущенных процессов на уровне класса.
  3. Измените текст кнопки на «Выполняется ...» или что-то подходящее.
  4. Присоедините базовый обработчик события RunWorkerCompleted к вашему процессу (будет объяснено в ближайшее время).
  5. Вызов backgroundWorker.RunWorkerAsync (rowIdentifier).

В обработчике событий DoWork ...

  1. Установите e.Result = e.Argument (или создайте объект, который будет возвращать как аргумент, так и желаемый результат)

В обработчике событий RunWorkerCompleted ...

  1. Удалить идентификатор строки из списка запущенных процессов (e.Result является идентификатором).
  2. Измените текст кнопки с «Выполняется ...» на «Готов»
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...