更新一个有变化的绑定GridView
本文关键字:有变化 绑定 GridView 一个 更新 | 更新日期: 2023-09-27 18:13:29
我有一个DataGridView的形式是绑定到对象列表。我有几个列,包括一个复选框列。其要求是,在给定时间,集合中只有一个项可以将数据绑定布尔属性设置为true。数据对象名为Interval,所讨论的属性是Program:
public bool Program
{
get { return _program; }
set
{
if (value)
{
Parent.Intervals.Except(new[] { this }).ForEach(interval => interval.Program = false);
}
_program = value;
OnPropertyChanged();
}
}
我期望的行为是,单击绑定复选框会将Interval的一个实例的Program属性设置为true,这样做会将所有其他实例的Program属性设置为false。这确实发生了,但是datagridview没有正确更新。它将使以前的复选框处于选中状态,在选择单元格或将鼠标移到另一个复选框上之后,它将更新该特定的复选框。
我如何让数据网格视图准确地显示我的对象的状态。我信任你,DataGridView!你骗了我。我…我再也不能相信你说的任何话了。
解决方案是使用BindingList。当绑定到常规List或其他集合(不具有绑定特定类型)时,仅更新所选的行值。不过,BindingList还有一个额外的好处,即所有项的属性都会更新,而不仅仅是所选的行。请记住,如果您正在使用类似AddRange(来自List)的东西,您可能必须修改代码以在初始化时或通过循环添加项,因为BindingList没有AddRange方法(尽管可以编写扩展方法)。
试试这个
private void dgv_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if ((bool)dg.Rows[e.RowIndex].Cells[CheckBoxColumnIndex].Value)
{
var rows = (from DataGridViewRow row in Clients.Rows
where row.Index != e.RowIndex
select row).ToArray();
foreach(DataGridViewRow row in rows)
{
row.Cells[CheckBoxColumnIndex].Value = false;
}
}
}