单击 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
的数据源。
我有一个 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
的数据源。