Программно проверьте DataGridView CheckBox, который только что был снят - PullRequest
2 голосов
/ 26 мая 2020

Я знаю, что подобные вопросы задавались раньше, но ни одно из решений мне не помогает.

У меня есть 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?

1 Ответ

1 голос
/ 27 мая 2020

Вы можете зафиксировать редактирование сразу после возникновения события 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 - Обратите внимание, что это событие возникает на самом деле немедленно, до того, как код в предыдущем обработчике событий завершится

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...