Программно проверьте флажок 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(), поэтому CellValueChanged1 событие также возникает сразу, а не после того, как текущая ячейка теряет фокус.

Оцените здесь новое значение: поскольку значение изменилось, предполагается, что текущее значение противоположно предыдущему, при условии, что это 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() после проверки.

Другие вопросы по тегам