• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

C# datagridview绑定list后的问题

塔克茜丝 2021-05-11 02:21:11
我这里的需求是这样的,
我有一个List<List A>B;
ListB的每一个元素都是一个List A,
我在datagridview中绑定的是 List B.last();
然后我在dgv中修改后,我想与ListB的last进行对比。

这是我最后在保存功能的时候判断是否有修改。如果有修改,就在List B中add一个新的listA。
来模拟修改历史

问题就在list B的last绑定dgv后,list B的last也跟着一起改了,比对不了。

我又在listB last绑定dgv的同时,临时新建一个List A的temp,来存放listB的last

但是,dgv改变之后,这个temp里面的值也变了,这是什么情况?谁能帮忙解释下和解决这个问题。

我的最终目的就是,如果没有改值,点击保存的时候,不会add一个新的listA到ListB中,这个相等判断无法实现,因为原来的listB.last也变了。
...全文
112 点赞 收藏 10
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
谢谢上面对我的启发,那个深克隆,我直接用代码了。 List<A>Temp =new List<A>; foreach(var item in B) Temp.add(new A(.....)) 把item里面的值,一个个赋值进去,全部新建了。 我的list比较小,所以OK的
回复
xuzuning 05-11
datagridview的数据源应是datatable,把 List<T> zh'yu'z'n'huan'chenghttps://www.bbsmax.com/A/E35pqDYdvX/ 你可以将List<T> 转换成 DataTable 绑定到 datagridview
回复

public class User :  ICloneable
{
         /// <summary>
        /// 使数据的复制变为深复制,需要实现ICloneable接口
        /// </summary>
        /// <returns></returns>
        public object Clone()
        {
            return (Object)this.MemberwiseClone();
        }
}
回复
那怎么解决我现在面对的问题么? 怎么和原来的数据走对比呢?原来的数据被改掉了。
回复
xuzuning 05-11
虽然把 class 改成 struct 只是改个声明的问题,但也不建议那样做,毕竟 c#是面向对象编程 但一些传统的思维和做法也是要改改的,比如你的 留个副本
回复
把A改struct,我改的地方就很多了 那么怎么解决这个问题呢? 我List<A>Temp =new List<A>,然后Add,也没用。
回复
xuzuning 05-11
问题出在 A 而不是 List<A> 如果你的 A 不是类(class)而是结构(struct)的话,就不会有你现在的烦恼 datagridview的数据源应是datatable,虽然你图省事而使用 List<T>,也是可以的C# 并不会替你切断对象的引用
回复
恩,我猜到这个问题了,谢谢2位,那么怎么解决呢?留一个last的副本下来
回复
因为类是引用类型。。。
回复
深拷贝和浅拷贝的问题
回复
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2021-05-11 02:21
社区公告

让您成为最强悍的C#开发者