2008-09-17 3 views
2

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

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

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

ответ

3

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

Он работает достаточно хорошо, но есть два подводные камни:

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

В аналогичном образце есть DataGridView FAQ.

1

Вы могли бы дать этому попытку:

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

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

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

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

В событии RunWorkerCompleted hanlder ...

  1. Удалить идентификатор строки из списка запущенных процессов (e.Result - это идентификатор).
  2. Измените текст на кнопке «Запуск ..."to" Ready "
+1

Спасибо за интересную альтернативу, но я предпочел бы придерживаться стандартного визуального восприятия серых кнопок. – 2008-09-17 18:57:34

Смежные вопросы