日期:2014-05-18  浏览次数:20642 次

DataGridView的一个奇怪发现
我定义好了一个dgv1 里面数据项写好了 列写好了 绑定代码也写好了 

我 new了一个dgv2
for(int i=0;i<4;i++)
{
  dgv2=new DataGridView();

  dgv2=dgv1;

  dgv2.Columns.Remove(column[0]);
}

按道理说我应该编辑的是dgv2,但是我发现dgv1的column.count也同时在减1,也不知道大家有没有和我遇到相同的问题!

我只希望编辑dgv2 不动dgv1。

如果遇到了,是如何解决的呢?



------解决方案--------------------
datagrdiview 是一个referenceType,你做了dgv2=dgv1的话,那么你所操作的就是同一个object了。
你想要做到你现在的这种效果,请不要使用dgv2=dgv1,你最好是把第一个cell的内容给弄过去。
这样的话,就不会出现你现在的这种问题了。

而且,DataGridView的作用其实不是在这里,它主要是用来做DataBinding的,那么你最好让它和DataSource放在一起使用。
这样用起来才不会觉得怪。
------解决方案--------------------
哦,那如果是这样的话事情就好办了。
其实这两个datagridview有不同的数据,那么有不同的数据,我们就用两个datasource来保存。
所以这里有这几步:
第一点:
初始化datagridview2,这里我们拿到datagridview的datasource,把它做一份copy(clone),来保存到另一个数据源中datasource2.
把datasource2做为datagridview2的datasource.
第二点:
操作datagridview2,这个时候肯定不会对datagridview1有什么影响的。
第三点:
导出数据。

还有,当中可能会有数据发生变化,那么这个时候就要重新的去做上面这三步的。

为什么让你这么做,就是因为你的view有两种,同样data也是有两种。
我们一般情况下要把data和view分开的。

------解决方案--------------------
你用两个DataGridView不是更麻烦了?直接从你的DataSource里把相应的行和列里的数据取出来。倒出来就可以了啊。
------解决方案--------------------
这不是奇怪现象,是正常现象
因为对象按址传递的,当然一个改全改,你要创建一个副本才行

另外创建副本也不是二楼的Clone方法就能实现的,DV跟本没有这个函数

应该是

foreach(DV1列 列 in DV1.列集合)
{
DV2.列.ADD(列)
}

foreach(DV1行 行 in DV1.行集合)
{
DV2.行.ADD(行)
DV2.行.cell[0].value=行.cell[0].value
DV2.行.cell[1].value=行.cell[1].value
DV2.行.cell[2].value=行.cell[2].value

}