Программно проверьте флажок DataGridView, который был только что снят
Я знаю, что подобные вопросы задавались и раньше, но ни одно из решений мне не помогает.
У меня есть DataGridViewCheckBoxColumn в несвязанном DataGridView.
вCellContentClick
Когда флажок CheckBox снят, я предлагаю пользователю продолжить эту операцию в соответствии с бизнес-правилами DataGridView, и, если они решат не продолжать, я хочу еще раз проверить CheckBox.
Это повторная проверка CheckBox, которая не работает.
Вот мой код:
private void dgvPeriods_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == dgvPeriods.Columns["colSelected"].Index)
{
dgvPeriods.CommitEdit(DataGridViewDataErrorContexts.Commit);
DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)dgvPeriods[e.ColumnIndex, e.RowIndex];
if (chk.Value = chk.FalseValue)
{
If (MessageBox.Show("Continue with this Operation?", "Continue", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
{
chk.Value = chk.TrueValue;
return;
}
}
}
}
Значение ячейки устанавливается, но визуально CheckBox не проверяется.
Если пробовали разные типы для TrueValue
а также FalseValue
(логические против строк), я пробовал позвонить Refresh()
, Я пытался позвонить CommitEdit()
, Я пробовал использовать CheckState.Checked
.
Что я могу сделать, чтобы визуально перепроверить CheckBox?
2 ответа
Вы можете зафиксировать редактирование сразу после CellContentClick
событие вызывается с помощью (правильного ) метода EndEdit(), поэтому CellValueChanged
1 событие также возникает сразу, а не после того, как текущая ячейка теряет фокус.
Оцените здесь новое значение: поскольку значение изменилось, предполагается, что текущее значение противоположно предыдущему, при условии, что это bool
Колонка.
На этом этапе, если пользователь подтверждает сделанный выбор, вы сбрасываете значение и вызываете RefreshEdit(), чтобы перерисовать CheckBox в его текущем состоянии.
Примечание: поведение вашего DataGridView может зависеть от контекста ваших операций.
private void dgvPeriods_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex != dgvPeriods.Columns["colSelected"].Index) return;
bool newValue = (bool)dgvPeriods[e.ColumnIndex, e.RowIndex].Value;
if (!newValue) {
if (MessageBox.Show("Continue with this Operation?", "Continue",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
dgvPeriods[e.ColumnIndex, e.RowIndex].Value = true;
dgvPeriods.RefreshEdit();
}
}
}
private void dgvPeriods_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
// You need to evaluate whether EndEdit() applies to just this Column
if (e.ColumnIndex != dgvPeriods.Columns["colSelected"].Index) return;
dgvPeriods.EndEdit();
}
1 - Обратите внимание, что это событие действительно возникает немедленно, до завершения кода в предыдущем обработчике событий.
ты должен просто использовать
YourDataGridview.EndEdit()
после проверки.