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

时间:2015-02-18 16:12:27

标签: .net winforms datagridview refresh

我有一个DataGridView,它被数据绑定到我自己的一个类的对象列表中。 DataGridView设置为显示一个文本列以及两个复选框列,其行为类似于单选按钮:单击未选中的复选框将检查它并取消选中另一个,而单击选中的复选框则不执行任何操作。

我使用类似下面的类来执行此操作:

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;
            }
        }
    }
}

在幕后,这可以按预期工作:设置"是"真实的"价值"如果设置"否"假,反之亦然,但你不能设置"是"或"否"为假。

问题是DataGridView行没有更新,直到行没有聚焦,这意味着(例如)取消选中" Yes"虽然基础财产仍然是真实的,但仍然有效。并检查"否"没有取消选中"是"而基础财产已变为虚假。

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

怎么办呢?

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

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

这适用于当前单元格的值,因此您无法取消选中某个框,但其他单元格仍会保持选中状态。我试图添加dgvCheckValues.InvalidateRow(dgvCheckValues.CurrentRow.Index);,但它没有效果。

1 个答案:

答案 0 :(得分:0)

我最终想通了。这是因为我使用List代替BindingList

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