System windows forms datagridviewcell value get вернул null

Обновлено: 07.07.2024

Кажется, я не могу найти событие, которое срабатывает сразу после изменения проверенного состояния.

Редактировать:

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

Вы проверили событие CurrentCellDirtyStateChanged ? – Yograj Gupta 21/11/2021

По-прежнему выполняется только тогда, когда пользователь «покидает» ячейку. – PJW 21/11/2021

Чтобы обработать событие DatGridView s CheckedChanged , вы должны сначала запустить CellContentClick (у которого нет текущего состояния CheckBox es!), А затем вызвать CommitEdit . Это, в свою очередь, вызовет событие CellValueChanged , которое вы можете использовать для выполнения своей работы. Это недосмотр Microsoft . Сделайте что-нибудь вроде следующего .

Надеюсь, это поможет.

Я также настоятельно рекомендую НЕ использовать это решение для проблемы двойного щелчка. Необходимо вызвать функцию EndEdit () . найдите ссылку на @ 56ka и щелкните ссылку на статью! – Luke 07/08/2012

Я не тратил много времени на это решение, и если решение @ 56ka лучше, отлично. Однако я не уверен, что такое суета о двойном щелчке по DataGridViewCheckBox . Это не WPF, и двойной щелчок по элементу управления не нарушает привязку данных, это WinForms. Двойной щелчок может не обновить элемент управления визуально, но он ничего не сломает, и в этом случае, возможно, решение, приведенное ниже, является лучшим. Спасибо. – MoonKnight 07/08/2012

Это отлично работает, если вы добавите тот же код из CellContentClick в CellContentDoubleClick . CellMouseUp будет срабатывать, даже если ячейка выбрана, но флажок не установлен, что является нежелательным поведением. – torpid prey 07/08/2012

Я обнаружил, что решение @Killercam работает, но было немного хитро, если пользователь дважды щелкал слишком быстро. Не уверен, что это так и было обнаружено другими. Я нашел другое решение здесь .

Он использует CellValueChanged и CellMouseUp сети данных. Чанхун объясняет, что

"Причина этого в том, что событие OnCellvalueChanged не срабатывает, пока DataGridView не решит, что вы завершили редактирование. Это дает толчок для столбца TextBox, поскольку OnCellvalueChanged не будет [беспокоить] срабатывание при каждом нажатии клавиши, но не [ имеет смысл] для CheckBox ".

Вот это действие из его примера:

И код, сообщающий флажку, что при щелчке по нему завершено редактирование, а не ждать, пока пользователь покинет поле:

Изменить: событие DoubleClick обрабатывается отдельно от события MouseUp. Если обнаружено событие DoubleClick, приложение полностью проигнорирует первое событие MouseUp. Эту логику необходимо добавить в событие CellDoubleClick в дополнение к событию MouseUp:

Я столкнулся с проблемой двойного щелчка, отмеченной респондентом, и это сработало намного лучше, чем первое решение при правильной обработке. – Steve Ferguson 21/02/2013

Я также столкнулся с проблемой двойного щелчка, и это решение устранило ее. – Chris C 21/02/2013

Что, если вы переключите переключатель с помощью пробела? – Halfgaar 21/02/2013

Я работаю с привязкой данных, которые меняются в обработчике событий. Следовательно, после EndEdit() у меня также должны были быть все Refresh() в сетке. – Halfgaar 21/02/2013

Решение Killercam вообще не работает, но работает отлично. – Tassisto 21/02/2013

Решение jsturtevants отлично работало. Однако я решил выполнить обработку в событии EndEdit. Я предпочитаю этот подход (в моем приложении), потому что, в отличие от события CellValueChanged, событие EndEdit не срабатывает, пока вы заполняете сетку.

Вот мой код (часть которого украдена у jsturtevant:

Хороший ответ, но предпочтительнее использовать CellContentClick вместо CellMouseUp , потому что последний будет вызываться, когда пользователь щелкает где-нибудь внутри ячейки, тогда как первый вызывается только при щелчке флажка. – Jamie Kitson 06/10/2014

Этот ответ содержит правильный ответ, который обрабатывает как взаимодействия с мышью и клавиатурой, так и повторяющиеся взаимодействия, не покидая ячейку. Но нужен только последний обработчик - вызов CommitEdit из CurrentCellDirtyStateChanged - это полное решение. – Ben Voigt 12/12/2012

Это также обрабатывает активацию клавиатуры.

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

с этим вы можете использовать его даже с другим событием.

Одна из лучших вещей в этом - отсутствие необходимости в нескольких мероприятиях.

Читайте также: