C#中DataTable排序、检索、合并等操作实例
一、排序
1.获取DataTable的默认视图
2.对视图设置排序表达式
3.用排序后的视图导出的新DataTable替换就DataTable(Asc升序可省略,多列排序用","隔开)
1)、重生法
dataset.Tables(0).DefaultView.Sort = "id desc"
2)、直接法
dv.Sort = "id desc"
dt = dv.ToTable();
3)、间接法
dv.Sort = "id desc"
dt = dv.ToTable();
二、检索
设置查询字符串
使用Select方法获取到所有满足条件的数据行对象数组 (多项查询条件间,用and隔开)
string strName = matches[0]["name"].ToString();
三、合并
假定有2个DataTable:Dt1 , Dt2。表结构一样
将Dt2接在Dt1后可采用此方法
四、在DataTable中查询应该注意的问题
完成一个查询,返回一个DataTable后,很多时候都想在查询结果中继续搜索。这时可以使用DataTable.Select方法对结果进行再查询
Select方法有4个重载,我们经常用到的就是DataTable.Select(String)
这个String的参数是查询的限定式。相当于SQL查询语言中的WHERE语句(不含WHERE),其语法符合SQL语言语法。
Select方法的返回的是包含查询到的数据的DataRow,但是这个DataRow只是被查询的DataTable的一个映射,所以DataRow是随着DataTable的行变化而变化的。例如,DataTable的行都被删除了,那么DataRow中的数据同样被删除了(即便是先Select,再删除的)
所以,要想把返回的DataRow放进数据显示控件中,需要将其放入另一个DataTable中,如果直接放入原DataTable或将原DataTable的行全部清除再放入查询所得的数据都是不行的,程序会显示错误,错误提示是“表中已有此行”。
另外,在一个新表中插入行,不能直接用DataTable.Rows.Add(DataRow)的方式,因为这样是插入一个新表,也就是DataRow是空的。要用导入行的方式,DataTable.ImportRow(DataRow)。当然,前提是这个新表要有与原数据表一样的结构。
'用来存储再查询后的数据表
Dim ReSearchDT As DataTable = InputDT.Clone() '保证有与源数据表相同的表结构
'用来存储查询后返回的datarow数组
Dim ReSearchDR() As DataRow = Nothing
Try
ReSearchDR = InputDT.Select("NAME LIKE '%" + SearchStr + "%'") '只是从数据表中映射出来datarow(),所以不能删除原表中的行
Catch ex As Exception
Return Nothing
End Try
For i As Int16 = 0 To ReSearchDR.Length - 1
ReSearchDT.ImportRow(ReSearchDR(i))
Next
Return ReSearchDT
End Function
附:筛选DataTable数据的方法
对DataTable进行过滤筛选的一些方法Select,dataview
当你从数据库里取出一些数据,然后要对数据进行整合,你很容易就会想到:
for (int i = 0; i < dt.Rows.Count; i++)
{
if (dt.Rows[i]["C1"].ToString() == "abc")//查询条件
{
//进行操作
}
}
但这种做法用一两次还好说,用多了就累了。那有没有更好的方法呢?记得LinQ是可以直接对DataTable进行查询操作的,那在.Net Framework 2.0里,有没有类似的方法呢?答案是肯定的,就是dt.Select(),上面的操作可以改成这样:
还可以这样操作:
DataRow[] drArr = dt.Select("'abc' LIKE C1 + '%'", "C2 DESC");//另一种模糊查询的方法
DataRow[] drArr = dt.Select("C1='abc'", "C2 DESC");//排序
问题又来了,如果要把DataRow赋值给新的DataTable,怎么赋值呢?你可能会想到:
for (int i = 0; i < drArr.Length; i++)
{
dtNew.Rows.Add(drArr[i]);
}
但这样程序就会出错,说该DataRow是属于其他DataTable的,那要怎么做呢?很简单,这样就可以解决了:
for (int i = 0; i < drArr.Length; i++)
{
dtNew.ImportRow(drArr[i]);
}
这样就完成了。
3.5里的DataRow[]有个扩展方法CopyToDataTable()
* 补充一下,还可以利用DataView来达到检索的目的。
*/
DataTable dataSource = new DataTable();
DataView dv = dataSource.DefaultView;
dv.RowFilter = "columnA = 'abc'";
//1.过滤后直接获取DataTable
DataTable newTable1 = dv.ToTable();
//2.设置新DataTable的TableName
DataTable newTable2 = dv.ToTable("NewTableName");
//3.设置新表是否过滤重复项,拥有的列的列名以及出现的顺序
//即可以设置新表的字段。但是字段名肯定是老表dataSource中拥有的。
DataTable newTable3 =
dv.ToTable(true, new string[] { "columnA,columnF,columnC" });
//4.综合了2.3两点。
DataTable newTable4 =
dv.ToTable("NewTableName", true, new string[] { "columnA,columnF,columnC" });
C#中DataTable删除行的方法,分享给大家供大家参考之用。具体实现方法如下:
自己的删除例子(drTemp是表,gvSummary是dev 的gridview。单击右键点击grid删除):
1、dtTemp.Rows.RemoveAt(gvSummary.FocusedRowHandle);
2、dtTemp.Rows[gvSummary.FocusedRowHandle].Delete(); dtTemp.AcceptChanges();
在C#中,如果要删除DataTable中的某一行,大致有以下几种办法:
1.如果只是想删除datatable中的一行,可以用DataRow的delete,但是必须要删除后让DataTable知道,所以就要用到.AcceptChanges()方法,原因是这种删除只是标识性删除,就像我们通常在数据库中用到的IsDelete字段。
Delete()之后需要datatable.AccepteChanges()方法确认完全删除,因为Delete()只是将相应列的状态标志为删除,还可以通过datatable.RejectChanges()回滚,使该行取消删除。
2.彻底删除就要用到datatable的.Rows.Remove(DataRow dr)方法,同理也只是删除一行可以,如果要循环删除请继续往下看。
3.循环彻底删除就要用.Rows.RemoveAt(int index)方法,所以如果你是foreach的爱好者,在此请你换换口味,还有如果你是for的i++的忠实fans也希望你能换个思维。先看一下上面程序的正向写法(错误的,不可用)
|
1
2
3
4
5
|
for (int i = 0, j = dt.Rows.Count; i < j; i++){ if (Convert.ToInt32(dt.Rows[i]["RowID"]) == RowID) dt.Rows.RemoveAt(i);} |
这个的错误在于datatable的RemoveAt()会在删除后更新dataTable的index,所以你要删除的index可能已经不是你的符合Convert.ToInt32(dt.Rows[i]["RowID"]) == RowID的index了,甚者还会抛出异常,说你访问的index不存在。
还是要慎用datatable.Rows.RemoveAt(i),若要删除多行,可以连续用Delete(),然后采用AccepteChanges()方法确认删除。
使用select方法:
先把要删除的记录标记一下,然后select删除行,实例代码如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
for (int i = 0; i < len; i++){ if (((CheckBox)Rp.Items[i].FindControl("CB")).Checked) { dt.Rows[i]["C0"] = 1;//标记要删除的记录 }}foreach (DataRow r in dt.Select("c0=1")){ r.Delete();}Rp.DataSource = dt;Rp.DataBind(); |
感兴趣的朋友可以测试运行本文实例以加深理解,希望本文所述对大家C#程序设计的学习有所帮助。
C#中DataTable排序、检索、合并等操作实例的更多相关文章
- git merge --squash 选项合并commit操作实例
参考: [转] git merge 将多个commit合并为一条之--squash 选项 git checkout master git pull origin master # 本地先拉取最新的m ...
- Mybatis笔记四:Mybatis中的resultType和resultMap查询操作实例详解
resultType和resultMap只能有一个成立,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,resultMap解决复杂查询是的映射问题.比 ...
- 第9.11节 Python中IO模块文件打开读写操作实例
为了对前面学习的内容进行一个系统化的应用,老猿写了一个程序来进行文件相关操作功能的测试. 一. 测试程序说明 该程序允许测试人员选择一个文件,自己输入文件打开模式.写入文件的位置以及写入内容,程序按照 ...
- datatable,查询,排序,复制等操作
DataTable排序,检索,合并详解 一.排序 获取DataTable的默认视图 对视图设置排序表达式 用排序后的视图导出的新DataTable替换就DataTable (Asc升序可省略,多列排序 ...
- 在C#中对Datatable排序【DefaultView的Sort方法】
在C#中对Datatable排序,[DefaultView的Sort方法] 代码如下: DataTable dt = new DataTable(); dt.Columns.Add("ID& ...
- QTP中DataTable操作大全
序曲 假设现在有一个Excel文件:D:\data.xls,里面的具体内容如下:有两个Sheet,第一个叫Login,第二个叫InsertOrder: 当前QTP的Test中有两个Action:Log ...
- MySQL中的排序(ORDER BY)
当使用 SELECT FROM 时,如果不排 序,数据一般将以它在底层表中出现的顺序显示.这可以是数据最初添加到表中的顺序.但是,如果数据后来进行过更新或删除,则此顺 序将会受到MySQL重用回收存储 ...
- (原创)[C#] DataTable排序扩展方法
一,前言 DataTable的应用极其广泛,对DataTable进行排序也有很多方式,每种的实现方式都不难,但是使用起来却比较繁琐,所以本人便写了一个扩展方法,专门对DataTable进行操作. 本篇 ...
- C# Datatable排序
在C#中要对Datatable排序,可使用DefaultView的Sort方法.先获取Datatable的DefaultView,然后设置 得到的Dataview的sort属性,最后用视图的ToTab ...
随机推荐
- 如何去各型MCU的官网上下载正确的数据手册
一.背景 感谢老司机左栋,虽然他一直很排斥这个名号 : ) ,可就技术上来说,还是当之无愧的. 弄了1年多单片机了,数据手册不是老员工或者头头给,就是从开发板资料拿.一直没有意识到,官网的东西才是最可 ...
- uva.10020 Minimal coverage(贪心)
10020 Given several segments of line (int the X axis) with coordinates [Li, Ri]. You are to choose t ...
- UVA1376.Animal Run (最小割转为最短路 && dijkstra)
Animal Run Time Limit:6000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status ...
- 【PHP面向对象(OOP)编程入门教程】21.多态的应用
多态是除封装和继承之外的另一个面象对象的三大特性之一,我个人看来PHP中虽然可以实现多态,但和c++还有Java这些面向对象的语言相比,多 态性并不是那么突出,因为PHP本身就是一种弱类型的语言,不存 ...
- 第2月第3天 egorefresh
egorefresh是很老的下拉刷新,它是一个uiview,在uitableview 下拉的时候显示不同的界面. egorefresh和uitableview的耦合度很高,uitableview滚动和 ...
- sass兼容IE8透明度方法
你可以轻松的利用 {Sass::Script::Functions#ie_hex_str ie_hex_str} 函数对其做转换.$translucent-red: rgba(, , , 0.5); ...
- [Android分享] 【转帖】Android ListView的A-Z字母排序和过滤搜索功能
感谢eoe社区的分享 最近看关于Android实现ListView的功能问题,一直都是小伙伴们关心探讨的Android开发问题之一,今天看到有关ListView实现A-Z字母排序和过滤搜索功能 ...
- Effective Java 读书笔记之七 通用程序设计
一.将局部变量的作用域最小化 1.在第一次使用变量的地方声明 2.几乎每个变量的声明都应该包含一个初始化表达式:try-catch语句是一个例外 3.使方法小而集中是一个好的策略 二.for-each ...
- 网络数据包发送工具PacketSender中文源码
在网上发现了一个好用的工具PacketSender,数据包发送器.对于写网络程序来说,有很大的便利性.虽然在linux下,netcat工具也很好用,但是这个也不错. 原本是英文的,给翻译了一下.这是基 ...
- HttpGet
private static void func_httpGet(String url) { HttpClient httpClient = new HttpClient(); try { GetMe ...