移走DataTable中其中的一列后DataGridView随之改变

leon51 2018-11-08 09:20:50
我将DataGridView中的数据保存到DataTable中,然后移走DataTable中其中的一列,移走后DataGridView随之改变,
DataGridView的数据是绑定的另一个DataTable,这就是所谓的浅度复制吗?
请问如何才能移走DataTable中的一列 而不影响DataGridView?谢谢!

DataTable dataTable = (DataTable)dgv.DataSource;
dataTable.Columns.Remove("ID");
...全文
77 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
张天星 2018-11-14
  • 打赏
  • 举报
回复
Query是给dgv赋值的,这个我就不提了。
dgv应该是一个Form成员对象。
DataTable dataTable = (DataTable)dgv.DataSource;
这句话中,你重新声明了一个dataTable ,但是你将dgv.DataSource直接赋值给dataTable。
看似你现在有dataTable和dgv两个数据对象,但是它们所指向的数据是同一个数据。
在内存中,你的这些数据是在同一个位置,同一个数据对象
因此,dataTable和dgv你不管修改了哪一个,最后的数据都一起发生变化。
但是 ((DataTable)dgv.DataSource).copy()就不同了。
copy真正复制了一个对象,在你的内存中,重新开辟了一片空间,重新写了一次数据,然后将这个数据交给了dataTable。
因此,这时候,你dataTable指向了新复制的数据,dgv.DataSource指向了原来的数据,就互不干扰了。
leon51 2018-11-12
  • 打赏
  • 举报
回复
引用
问个问题,dgv.DataSource是哪里来的?应该就是绑定dgv的那个数据吧? 那你这样转换,得到的dataTable 就和dgv是同一个数据。 你把这句改成DataTable dataTable = ((DataTable)dgv.DataSource).copy()试试
多谢我的回复,按照你的建议修改后OK了。 不过我还是不明白,我之前的代码大概类似下面这样:
private void Query()
{
	DataTable dataTable = DBHelper.ExecuteDataTable(connectionString, CommandType.Text, sql, null);
	int cnt = dataTable.Rows.Count;
	dgv.DataSource = dataTable;
}

private void Export()
{
	DataTable dataTable = (DataTable)dgv.DataSource;
	dataTable.Columns.Remove("id");			
}		
小马快跑! 2018-11-10
  • 打赏
  • 举报
回复
重新绑定,或者刷新下数据源就可以
张天星 2018-11-10
  • 打赏
  • 举报
回复
引用 0 楼 leon51 的回复:
我将DataGridView中的数据保存到DataTable中,然后移走DataTable中其中的一列,移走后DataGridView随之改变,
DataGridView的数据是绑定的另一个DataTable,这就是所谓的浅度复制吗?
请问如何才能移走DataTable中的一列 而不影响DataGridView?谢谢!

DataTable dataTable = (DataTable)dgv.DataSource;
dataTable.Columns.Remove("ID");

问个问题,dgv.DataSource是哪里来的?应该就是绑定dgv的那个数据吧?
那你这样转换,得到的dataTable 就和dgv是同一个数据。
你把这句改成DataTable dataTable = ((DataTable)dgv.DataSource).copy()试试
张天星 2018-11-10
  • 打赏
  • 举报
回复
引用 3 楼 leon51 的回复:
引用
为毛要移走??

不能将datagridview.columns("ID").visual =false


我那两句实际上是在两个方法中:
绑定dgv后我是将id隐藏的;
在另一个方法中,我需要将dgv中的数据保存到Excel,本来直接使用dgv也可导出,但是因为有其它用途,所以我就将dgv的数据先保存到datatable,想去掉id列后再保存到Excel。于是就出现了前述的问题。
奇怪的是我那个datatable是一个方法的局部变量, 为何去掉一列后会影响到dgv呢?

不知道你说的局部变量是什么样的局部变量。
如果是传参进来的,那么就不是局部变量,而是同一个对象。
如果是重新实例化的,建议用
DataTable dt=new DataTable(); --这个是你原来的数据源,和dgv绑定的
DataTable dtcopy=dt.copy(); //这里重新拷贝,完全拷贝一个新对象,用这个对象删除一个列,然后导出,应该不会影响原来的dataTable
正怒月神 2018-11-09
  • 打赏
  • 举报
回复
你重新绑定数据源就好了
eaqpi 2018-11-09
  • 打赏
  • 举报
回复
为毛要移走??

不能将datagridview.columns("ID").visual =false
leon51 2018-11-09
  • 打赏
  • 举报
回复
引用
你重新绑定数据源就好了
版主帮帮忙,见我3楼的回复!谢谢!
leon51 2018-11-09
  • 打赏
  • 举报
回复
引用
为毛要移走?? 不能将datagridview.columns("ID").visual =false
我那两句实际上是在两个方法中: 绑定dgv后我是将id隐藏的; 在另一个方法中,我需要将dgv中的数据保存到Excel,本来直接使用dgv也可导出,但是因为有其它用途,所以我就将dgv的数据先保存到datatable,想去掉id列后再保存到Excel。于是就出现了前述的问题。 奇怪的是我那个datatable是一个方法的局部变量, 为何去掉一列后会影响到dgv呢?

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧