我有一个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);
,但它没有效果。
答案 0 :(得分:0)
我最终想通了。这是因为我使用List
代替BindingList
。
或者,使用BindingSource
作为DGV的数据源,并将List
设置为BindingSource
的来源。