单击 CheckBoxCell 时如何使 DataGridView 刷新整行?

How can I make a DataGridView refresh the entire row when a CheckBoxCell is clicked?

我有一个 DataGridView,它数据绑定到我自己的 classes 之一的对象列表。 DataGridView 设置为显示一个文本列和两个行为类似于单选按钮的复选框列:单击一个未选中的列会选中它并取消选中另一个,而单击已选中的列什么也不做。

我使用如下所示的 class 来执行此操作:

public class YesNoQuestion
{
    public string Text { get; set; }
    public bool Value { get; set; }

    public bool Yes
    {
        get { return Value; }
        set
        {
            // This is supposed to work like a radio button, can't be unset.
            if (value)
            {
                Value = true;
            }
        }
    }

    public bool No
    {
        get { return !Value; }
        set
        {
            // This is supposed to work like a radio button, can't be unset.
            if (value)
            {
                Value = false;
            }
        }
    }
}

在幕后,这按预期工作:将 "Yes" 设置为 true 将 "Value" 设置为 true,将 "No" 设置为 false,反之亦然,但您不能设置任何一个"Yes" 或 "No" 为假。

问题是 DataGridView 行在该行未获得焦点之前不会更新,这意味着(例如)取消选中 "Yes" 可以工作,而基础 属性 仍然是 "true" 并选中 "No" 不会取消选中 "Yes",而基础 属性 已更改为 false。

如果我离开该行,数据就会显示正确。我想做的是确保无论何时单击任一复选框,都会立即重新加载整行数据。

如何做到?

我尝试添加以下内容,在收到有关更新 current 单元格值的问题的建议后:

private void dgvQuestions_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    if (dgvCheckValues.IsCurrentCellDirty)
    {
        dgvCheckValues.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
}

这适用于当前单元格的值,因此您不能取消选中一个框,但另一个单元格仍保持选中状态。我尝试添加 dgvCheckValues.InvalidateRow(dgvCheckValues.CurrentRow.Index); 但没有效果。

最后我想通了。这是因为我使用的是 List 而不是 BindingList.

或者,使用 BindingSource 作为 DGV 的数据源并将 List 设置为 BindingSource 的数据源。