C# List 改变后如何与自身进行比较?等于不起作用

问题描述 投票:0回答:1

我通过 DataSource 将 DataGrid 绑定到 List

在 dataGrid 中编辑值后,我想获取已修改的行。材料属性发生变化的地方。

为此,我想将 DataGrid 中的项目与绑定到 DataGrid 的静态列表中的相同项目(通过 ID 属性)进行比较。我认为可以通过 Equals 进行比较,但由于我的 List 是一个引用类型,并且它绑定到 DataGrid,我的主列表中的所有值也会发生变化。

我尝试将数据源更改为该列表的副本或数组,但无论如何我的源中的数据都会被修改。

  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 但我不确定。因为如果用户更改了一次值,然后再次将其更改为主要值会怎么样。对于该事件,它的值看起来会发生变化,但通常值会保持不变。

c# list datagrid
1个回答
1
投票

我不知道完整的背景,也无法给出明确的答案,但专注于收集的一些不同方法是:

  • 制作列表的“深层”副本以进行比较。 List.CopyTo 创建一个“浅”副本。对于深层复制,请使用
    new
    创建新实例。
  • Materials
    更改为值类型,即
    struct
    record struct
    。使用值类型,您将不会遇到深复制与浅复制问题。
  • Materials
    实现“脏”状态。当属性更改时,将
    IsDirty
    属性设置为 true。检测变化的对象变得
    .Where(x => x.IsDirty)
  • 如果
    Materials
    预计只是一个没有“智能”的普通旧数据对象,则可能需要包含
    Materials
    实例并跟踪脏状态的包装器或适配器。

所有这些方法都需要权衡。

© www.soinside.com 2019 - 2024. All rights reserved.