我通过 DataSource 将 DataGrid 绑定到 List
在 dataGrid 中编辑值后,我想获取已修改的行。材料属性发生变化的地方。
为此,我想将 DataGrid 中的项目与绑定到 DataGrid 的静态列表中的相同项目(通过 ID 属性)进行比较。我认为可以通过 Equals 进行比较,但由于我的 List
我尝试将数据源更改为该列表的副本或数组,但无论如何我的源中的数据都会被修改。
List<Materials> matList = Materials.allofmaterials;
dataGridView1.DataSource = matList;
//Materials[] array = new Materials[matList.Count];
//matList.CopyTo(array);
//dataGridView1.DataSource = array;
//List<Materials> newMateials = matList;
//dataGridView1.DataSource = newMateials;
object ok = item.DataBoundItem;
Materials m1 = ok as Materials;
Materials m2 = Materials.allofmaterials.Where(x => x.ID == m1.ID).First();
if( m1.Equals(m2)) // THIS DOESN'T WORK for me
{
//do my actions
}
如何检测哪些行已被修改,以及哪些属性到底已更改?
我考虑过 dataGridView1.CellValueChanged 但我不确定。因为如果用户更改了一次值,然后再次将其更改为主要值会怎么样。对于该事件,它的值看起来会发生变化,但通常值会保持不变。
我不知道完整的背景,也无法给出明确的答案,但专注于收集的一些不同方法是:
new
创建新实例。Materials
更改为值类型,即 struct
或 record struct
。使用值类型,您将不会遇到深复制与浅复制问题。Materials
实现“脏”状态。当属性更改时,将 IsDirty
属性设置为 true。检测变化的对象变得.Where(x => x.IsDirty)
。Materials
预计只是一个没有“智能”的普通旧数据对象,则可能需要包含 Materials
实例并跟踪脏状态的包装器或适配器。所有这些方法都需要权衡。