首页 文章

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

提问于
浏览
0

我有一个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;
            }
        }
    }
}

在幕后,这按预期工作:将“Yes”设置为true将“Value”设置为true,将“No”设置为false,反之亦然,但不能将“Yes”或“No”设置为false .

问题是DataGridView行在行未聚焦之前不会更新,这意味着(例如)取消选中“Yes”,而底层属性仍为“true”,并且选中“No”不取消选中“Yes”而底层属性已变为false .

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

怎么办?

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

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

这适用于当前单元格's value, so you can' t取消选中一个框,但另一个单元格仍保持选中状态 . 我试图添加 dgvCheckValues.InvalidateRow(dgvCheckValues.CurrentRow.Index); 但它没有效果 .

1 回答

  • 0

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

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

相关问题