Как отключить ячейку кнопки в WinForms DataGrid?

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

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

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


person Don Kirkby    schedule 17.09.2008    source источник


Ответы (2)


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

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

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

Аналогичный пример есть в часто задаваемых вопросах по DataGridView.

person Don Kirkby    schedule 17.09.2008

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

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

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

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

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

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

  1. Удалить идентификатор строки из списка запущенных процессов (идентификатор — e.Result).
  2. Измените текст кнопки с «Выполняется...» на «Готово».
person Austin Salonen    schedule 17.09.2008
comment
Спасибо за интересную альтернативу, но я предпочитаю стандартную визуальную подсказку с серыми кнопками. - person Don Kirkby; 17.09.2008