我有一个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 回答
我最终想通了 . 这是因为我使用了
List
而不是BindingList
.或者,使用
BindingSource
作为DGV的数据源,并将List
设置为BindingSource
的源 .