System windows forms datagridviewcell value get вернул null
Кажется, я не могу найти событие, которое срабатывает сразу после изменения проверенного состояния.
Редактировать:
Я пытаюсь добиться того, чтобы при изменении отмеченного состояния 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
Это также обрабатывает активацию клавиатуры.
Все дело в редактировании ячейки, проблема в том, что ячейка на самом деле не редактировалась, поэтому вам нужно сохранить изменения ячейки или строки, чтобы получить событие, когда вы установите флажок, чтобы вы могли использовать эту функцию:
с этим вы можете использовать его даже с другим событием.
Одна из лучших вещей в этом - отсутствие необходимости в нескольких мероприятиях.
Читайте также: