最近的一个项目中,要求用一个视图来表示数张表联合查询的结果,这个倒好做。但是在页面显示的时候,要求按一定顺序来显示,如果是每一行数据在一张表里的话,只需在视图中添加一列当标识就可以,但是有几行数据是在一张表里的,查询出来后的顺序不符合页面显示,虽然可以改变表的排序方式,但是感觉太麻烦,以后可能不好改,所以就用了一种笨方法,可能会对效率有影响,如果有更好的方法,大家一定要告诉我(⌒_⌒)。

我的方法就是将数据拿出来后,在业务逻辑层,用DataTable实例的Select()方法,查询出指定的列,然后将其加入到一个空的,表架构相同的表中(Clone()方法),这是希望整行插入到表中的,如果一个单元格一个单元格的复制,那就太没效率了(●''●),虽然我这个也没什么效率啦……

然后在插入的时候遇到了问题

 DataTable dt = new DataTable();dt.Columns.Add("A");dt.Columns.Add("B");dt.Columns.Add("C");
DataRow dr = dt.NewRow();//处理dr中的数据dt.Rows.Add(dr);

这是标准写法。

DataTable dt = new DataTable();dt.Columns.Add("A");dt.Columns.Add("B");dt.Columns.Add("C");
DataRow dr = dt.NewRow();DataTable dt2 = dt.Clone();//处理dr中的数据dt2.Rows.Add(dr);

但是这样写就会报错,“该行已经属于另一个表。”

这是因为dr的Table属性是指向dt的。

但是现在查看dt.Row.Count时,发现是0,而不是1呢?

这涉及到一个DataRowState 的问题

DataRowState 有5种状态

Detached 该行已被创建,但不属于任何 System.Data.DataRowCollection。System.Data.DataRow 在以下情况下立即处于此状态:创建之后添加到集合中之前;或从集合中移除之后。
Unchanged 该行自上次调用 System.Data.DataRow.AcceptChanges() 以来尚未更改。
Added

该行已添加到System.Data.DataRowCollection 中,System.Data.DataRow

.AcceptChanges()尚未调用。

Deleted 该行已通过 System.Data.DataRow 的 System.Data.DataRow.Delete() 方法被删除。
Modified 该行已通过 System.Data.DataRow 的 System.Data.DataRow.Delete() 方法被删除。
DataRow dr = dt.NewRow();
//创建dr后,dr的DataRowState为Detacheddt2.Rows.Add(dr);
// dr的DataRowState为Added

也就是状态的更改。

但是如果我们把dt2.Rows.Add(dr)换成dt2.Rows.ImportRow(dr)后,发现dt中仍然没有dr,也就是dt.Row.Count为0。这是因为ImportRow方法负责复制dr到dt中,包括DataRowState。但是复制的时候会改标dr的Table的指向,也就是指向当前调用ImportRow方法的DataTable。

例如:

DataTable dt,dt2;
DataRow dr;dt = new DataTable();
dt.Columns.Add("A");
dt.Columns.Add("B");
dt.Columns.Add("C");dr = dt.NewRow();dt2 = dt.Clone();if (dt2.Rows[0].Table == dt)
{Console.WriteLine("dt2=dt");}if (dt.Rows[0] == dr){Console.WriteLine("dt=dr");}if (dt2.Rows[0] == dr){Console.WriteLine("dt2=dr");}

输出结果:

dt=dr

但是我们的目标是将挑选出来的行,添加到相同结构的空表中,对于挑选的结果行,是能添加到空表中的,因为如果是从一个DataTable中取出DataRow,那么这个DataRow的DataRowState是Add,也就是使用ImportRow方法添加到空表后可以看到结果,如果是通过dt = new DataTable()创建的且未添加到DataTable的DataRow,使用ImportRow方法添加到空表后是看不到结果的。

DataTable dt,dt2;
DataRow dr,dr2;dt = new DataTable();
dt.Columns.Add("A");
dt.Columns.Add("B");
dt.Columns.Add("C");dr = dt.NewRow();dr2 = dt.NewRow();dt2 = dt.Clone();dt.Rows.Add(dr);dt2.ImportRow(dr2);Console.WriteLine(dt2.Rows.Count.ToString());dt2.ImportRow(dt.Rows[0]);Console.WriteLine(dt2.Rows.Count.ToString());

结果:

0

1

注意:ImportRow方法是复制DataRow,也就是说会创建一个新的DataRow,而不是引用原来的DataRow。

转载于:https://blog.51cto.com/270jia40/1626056

DataTabel中关于ImpotRow的一点尝试相关推荐

  1. 对chrome中出现已尝试对扩展程序降级的问题的一点尝试

    今天碰到这个问题,是IDM扩展程序无法在chrome中添加,出现"已尝试对扩展程序降级".百度了一下,网上所说的方法:http://tieba.baidu.com/p/202053 ...

  2. 公开课精华 | 无人驾驶中感知的挑战与尝试

    本文总结于深圳元戎启行公司点云感知方向技术负责人邹晓艺,在深蓝学院的关于无人驾驶中感知的挑战与尝试的公开课演讲内容. 全文约3500字 主讲人邹晓艺来自深圳元戎启行公司,曾在百度IDL和ADU部门工作 ...

  3. mysql 手动写时间_关于数据库中如何存储时间的一点思考

    1.切记不要用字符串存储日期 我记得我在大学的时候就这样干过,而且现在很多对数据库不太了解的新手也会这样干,可见,这种存储日期的方式的优点还是有的,就是简单直白,容易上手. 但是,这是不正确的做法,主 ...

  4. 无法启动此程序,因为计算机中丢失 MSVCP120.dll。尝试安装该程序以解决此问题

    无法启动此程序,因为计算机中丢失 MSVCP120.dll.尝试安装该程序以解决此问题 参考文章: (1)无法启动此程序,因为计算机中丢失 MSVCP120.dll.尝试安装该程序以解决此问题 (2) ...

  5. PB程序“无法启动此程序,因为计算机中丢失PBvm90.dll。尝试重新安装该程序以解决此问题”的解决方法

    PB程序"无法启动此程序,因为计算机中丢失PBvm90.dll.尝试重新安装该程序以解决此问题"的解决方法 参考文章: (1)PB程序"无法启动此程序,因为计算机中丢失P ...

  6. Golang中WaitGroup使用的一点坑

    Golang中WaitGroup使用的一点坑 Golang 中的 WaitGroup 一直是同步 goroutine 的推荐实践.自己用了两年多也没遇到过什么问题.直到一天午睡后,同事扔过来一段奇怪的 ...

  7. 【ABAP系列】SAP ABAP中关于commit的一点解释

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP中关于commi ...

  8. 启动hadoop输入jps显示:程序 ‘jps‘ 已包含在下列软件包中: * openjdk-7-jdk * openjdk-6-jdk 请尝试:sudo apt-get install ~

    按理说:启动hadoop成功后,输入jps,应该可以看到NameNode,DataNode和SecondaryNameNode. 但是我启动hadoop,输入jps后,终端显示: 程序 'jps' 已 ...

  9. 无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll。尝试重新安装该程序以解决此问题。

    报错:         无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll.尝试重新安装该程序以解决此问题.如图所示: 解决方案: 方案一.替换api- ...

最新文章

  1. Redis 桌面管理工具 RedisDesktopManager 2020.1 发布
  2. 小鱼儿 c语言,小鱼儿请进.
  3. 【科普】OSS存储的基本操作
  4. unity 斥力_基于绝对能量守恒原理的基础物理理论-国家科技图书文献中心.PDF
  5. TI DSP位域寄存器文件(Bit Field and Register-File Struc...
  6. ionic创建应用的三个模版
  7. Silverlight新型的富媒体
  8. 利用计算机进行导弹轨道计算,超级计算机为何被称为大国重器?可模拟核试验或测算弹道导弹轨迹!...
  9. 直播电商平台开发,点击让窗口抖动动画效果
  10. Unity 自学成长路线总结
  11. MATLAB--数字图像处理 特征点匹配
  12. P2905 [USACO08OPEN]农场危机Crisis on the Farm
  13. HMS华为账号登入全部流程加详解流程机制
  14. Android 实现URL生成二维码
  15. 吴恩达《深度学习》笔记汇总
  16. 拯救视频模糊感,一些视频画质修复的小妙招
  17. Windows Sever(基本环境配置1)
  18. Educational Codeforces Round 130 (Rated for Div. 2) A--C
  19. 【Error解决实录】UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xfc in position 7: invalid start byt
  20. 贝尔华为OLT业务替换方案

热门文章

  1. Ubuntu 首次给root用户设置密码
  2. python之网络编程 --- TCP编程
  3. 验证启用了不安全的HTTP方法
  4. Python类的实例属性详解
  5. 一个线程资源中有多个模态对话框的问题
  6. C#实现查找指定端口被哪个进程占用并处理进程及dos命令下操作
  7. C# 获得窗体句柄并发送消息(利用windows API可在不同进程中获取)
  8. C#获取本机IP地址字符串
  9. ASP.NET简易教程-页面布局
  10. 在C#中调用一个dll函数,其中有个参数为 hdc,如何在C#中得到这个值并传给这个参数呢?