Да ... не то, чтобы вы, вероятно, заботились об этом, но я недавно столкнулся с тем, что, как я полагаю, является той же самой проблемой: если вы щелкнули по выбранному флажку, это direct , причина его проверки или Если флажок снят, то все, что вам нужно сделать, это обработать CellDirtyStateChanged объекта DataGridView и сообщить сетке CommitEdit о себе. С другой стороны, если флажок в DataGridViewCheckBoxColumn изменяет состояние по любой другой причине, а не потому, что вы просто щелкнули по нему (например, результат использования контекстного меню для их пакетного переключения или его установки программно после проверки чего-либо) и этот флажок имеет фокус, насколько я мог сказать, не говоря уже об отмене выбора, он заставил бы его перерисовать себя с правильной проверкой.
К сожалению, я не нашел способа обойти это, поэтому я обманул: после кода, ответственного за программное переключение флажка ячейки, если IsCurrentCellInEditMode сетки был истинным, а столбец CurrentCell был столбцом флажка, я просто переместил столбец CurrentCell снова и снова. Не самое симпатичное решение, но мне надоело бороться с этим контролем, и он работал без каких-либо явных мерцаний или чего-то такого, так что ... достаточно хорошо.
Конечно, если вы просто проверяете одну ячейку, по которой щелкнули, вероятно, есть более простые способы, включая проверку самого значения, а не обработку проверки в событии click и принудительное изменение измененного значения самостоятельно.