太久没写C#,这段时间项目没那么忙了,利用这段时间温故知新下吧,总结下datatable的使用方法,我主要参考的文章有:
https://blog.csdn.net/qq_36059321/article/details/89947542
//创建表 //创建一个没有表名的表 DataTable dt = new DataTable(); //创建一个有表名的表 DataTable table = new DataTable("NewTable"); //创建列(下面2种都行) //创建空列,没有指定列名(默认就是column1)和列的类型(默认就是string) table.Columns.Add(new DataColumn()); table.Columns.Add(); //创建带列名和类型名的列 table.Columns.Add("列1",typeof(int)); //新增空行 table.Rows.Add(); //新增有值的行 table.Rows.Add("列1", "列2", 2);//Add里面参数的数据顺序要和dt中的列的顺序对应 //通过复制dt2表的某一行来创建 //dt.Rows.Add(table.Rows[i].ItemArray); //赋值和取值 //新建行的赋值,这里只是给行赋值了,该行并没有添加到: table DataRow dr = table.NewRow(); dr[0] = "张三";// 通过索引赋值 dr["column2"] = "李四";//通过字段名赋值 //将某行加入到表 table.Rows.Add(dr.ItemArray); //对datatable进行赋值(修改) table.Rows[1][0] = "第二行第一列";//通过索引赋值 table.Rows[1]["column2"] = "第二行第二列";//通过字段名称赋值 //对datatable进行取值 //string name = dt.Rows[1][0].ToString(); //string time = dt.Rows[1]["column2"].ToString(); //筛选数据 //选择column1列值为空的行的集合 DataRow[] drs = table.Select("column1 is not null"); //将DataRow转成datatable table = drs.CopyToDataTable(); //选择column0列值为"李四"的行的集合 DataRow[] drs1 = dt.Select("column0 = '李四'"); //筛选column0列值中有"张"的行的集合(模糊查询) DataRow[] drs2 = dt.Select("column0 like '张%'");//如果的多条件筛选,可以加 and 或 or //筛选column0列值中有"张"的行的集合并按column1降序排序 DataRow[] drs3 = dt.Select("column0 like '张%'", "column1 DESC"); //行的删除 //使用DataTable.Rows.Remove(DataRow)方法 dt.Rows.Remove(dt.Rows[0]); //使用DataTable.Rows.RemoveAt(index)方法 dt.Rows.RemoveAt(0); //使用DataRow.Delete()方法 dt.Rows[0].Delete(); dt.AcceptChanges(); //-----区别和注意点----- //Remove()和RemoveAt()方法是直接删除 //Delete()方法只是将该行标记为deleted,但是还存在,还可DataTable.RejectChanges()回滚,使该行取消删除。 //用Rows.Count来获取行数时,还是删除之前的行数,需要使用DataTable.AcceptChanges()方法来提交修改。 //如果要删除DataTable中的多行,应该采用倒序循环DataTable.Rows,而且不能用foreach进行循环删除,因为正序删除时索引会发生变化,程式发生异常,很难预料后果。 for (int i = dt.Rows.Count - 1; i >= 0; i--) { dt.Rows.RemoveAt(i); } table.Clear(); //清除表所有的数据 //复制表,同时复制了表结构和表中的数据 DataTable dtNew = new DataTable(); dtNew = dt.Copy(); //复制表 //DataTable dtNew = dt.Copy(); //复制dt表数据结构 //dtNew.Clear() //清空数据 //for (int i = 0; i < dt.Rows.Count; i++) //{ // if (条件语句) // { // dtNew.Rows.Add(dt.Rows[i].ItemArray); //添加数据行 // } //} ////克隆表,只是复制了表结构,不包括数据 //DataTable dtNew = new DataTable(); //dtNew = dt.Clone(); ////如果只需要某个表中的某一行 //DataTable dtNew = new DataTable(); //dtNew = dt.Copy(); //dtNew.Rows.Clear();//清空表数据 //dtNew.ImportRow(dt.Rows[0]);//这是加入的是第一行 //表排序,排序后再转成 datatable table.Rows.Add("第二行第一列", "列3", 2); table.Rows.Add("第二行第一列", "列4", 2); table.Rows.Add("第二行第一列", "列1", 2); table.Rows.Add("第 二行第一列", "列1", 2); table.Rows.Add("第 二行第一列", "列1", 2); table.DefaultView.Sort = "column1 DESC,column2"; table = table.DefaultView.ToTable(); //如上的 ToTable 有2个重载,介绍下 table = table.DefaultView.ToTable(true, "column1", "column2"); //true是对返回的数据过滤去重,后面所有的参数都是返回字段名,这里是:返回"column1", "column2"字段并且去重 table = table.DefaultView.ToTable("新表",true, "column1", "column2");//这个是在上面的基础上,对新表取一个名字 //字段的计算,avg,count,sum,min,max table.Compute("avg(字段名)", "字段名>100"); //合并表 table.Merge(dt); //查询出表的某一列 var djh1 = table.AsEnumerable().Select(r => r["column1"]).ToList(); //将查询出来的某一列加载到下拉框里面 cboFromLine.DataSource = null; cboFromLine.DataSource = djh1; //datatable的遍历 //1、遍历表里面的每一个数据 for (int i = 0; i < table.Rows.Count; i++) { for (int j = 0; j < table.Columns.Count; j++) { table.Rows[i][j].ToString(); } } //2、遍历表里面的每一个数据,使用foreach对每一行处理 foreach (DataRow dr2 in table.Rows) { for (int j = 0; j < table.Columns.Count; j++) { dr2[j].ToString(); } } //对DataTable做LINQ查询 var results = from myRow in table.AsEnumerable() where myRow.Field<int>("列1") == 1 select myRow;