当我将一个DatagridviewRow添加到Dictionary并删除DatagridviewRow时,Dictionary中的Datagridviewrow也会发生变化。但我不希望字典改变
Dictionary<int, CustomDataGridViewRow> _cache = new Dictionary<int, CustomDataGridViewRow>();
public void add(int index, CustomDataGridViewRow row)
{
_cache.Add(index, row);
}
this.Rows.RemoveAt(1);
我尝试了克隆行,但是我没有复制该行,它创建了一个新行。看看这个:
答案 0 :(得分:4)
然后,您需要在添加字典条目之前克隆该对象。
字典不包含对象 - 它包含引用。字典本身不是更改 - 它只包含对已更改的对象的引用。
如果您的对象支持克隆,您可以使用:
public void Add(int index, CustomDataGridViewRow row)
{
_cache.Add(index, (CustomDataGridViewRow) row.Clone());
}
您可能希望查看DataGridViewRow.Clone
的文档,了解更多详情......
无论哪种方式,非常重要的是你了解引用类型在C#中的工作方式,否则你会不断碰到这一点。
答案 1 :(得分:2)
当您将row
添加到字典中时,您正在向该行添加引用。
这意味着所有对它的引用都会看到对行的更改。
您可以通过向字典(也称为克隆)提供行的副本来避免这种情况。
答案 2 :(得分:1)
字典只包含一个引用,首先克隆该项:
_cache.Add(index, row.Clone());