После долгих изысканий проблема решена:
Такое поведение
DataGridViewCheckBoxCell обусловлено тем, что при редактировании в таблице поля ячейки само значение не меняется пока мы не выйдем из редактирования.
При текстовом типе поле ячейки (
DataGridViewTextBoxCell) это выглядит очень логично:
1) Мы выбираем ячейку
2) Мы открываем ее на редактирование, меняем в ней текст как нам нужно
3) Мы выходим из редактирования ячейки (подтверждаем установленное значение) и при этом вызывается событие на изменение значения
При стиле колонки
DataGridViewCheckBoxColumn и соответственно поле ячейки типа
DataGridViewCheckBoxCell такое поведение сохраняется, но выглядит странно:
1) Мы выбираем ячейку
2) Начинаем кликать по галочке, но значение при этом не меняется хотя кажется что мы поменяли его... На самом же деле мы в режиме редактирования ячейки, и, как и в случае с текстовым полем, пока мы не подтвердим установленное значение (не выйдем из режима редактирования) значение не поменяется.
Нужно выполнить пункт 3:
3) Выходим из редактирования (нажатием enter или перемещением фокуса на другую ячейку) и вызывается событие на изменение значения ячейки
С такой проблемой не очевидного (хотя и верного) поведения сталкивалось довольно много народу, так что наплодилось несколько
костылей решений (
msdn,
so) для того чтобы значение ячейки менялось сразу при клике на галочку чекбокса.
Я же смог написать немного более универсальное решение, которое работает не только на клик, хотя все же есть что еще там дополнить:
System::Void dgvCurrentCellDirtyStateChanged(System::Object^ sender, System::EventArgs^ e)
{
auto dgv = dynamic_cast<System::Windows::Forms::DataGridView^>(sender);
if (dgv == nullptr)
return;
if (dgv->CurrentCell->GetType() != System::Windows::Forms::DataGridViewCheckBoxCell::typeid)
return;
if (dgv->IsCurrentCellDirty)
dgv->CommitEdit(DataGridViewDataErrorContexts::Commit);
}
данный обработчик нужно повесить на событие
CurrentCellDirtyStateChanged вашего
DataGridViewDataGridView1->CurrentCellDirtyStateChanged += gcnew System::EventHandler(dgvCurrentCellDirtyStateChanged);
Обращаю внимание на то что данный обработчик будет вызываться каждый раз когда будет происходить какое либо редактирование любой ячейки вашей таблицы. Так что производительность приложения может снизиться если у вас смешанная таблица из редактируемых чекбоксов, текстовых полей и т.п.