【澳门葡京备用网址】伊始,DataTable一些选择办法

C#DataTable一些应用办法

  1. 运用Select方法寻找没有主键的表
    DataTable的Select方法重临1个DataRow数组,有多个重载的函数。

DataTable的细节

本篇小说适合有早晚的功底的人去查看 ,最棒读书过一定net
编制程序基础在来查阅此小说。

  1,使用DataTable必需求引用System.Data.

DataView prodView = new DataView(prodDS.Tables[“Products”],
                                  “UnitsInStock <= ReorderLevel”,
                                  “SupplierID, ProductName”,
                                  DataViewRowState.CurrentRows);

DataTable是表格数据块在内存中的表示。即使可以手动以编制程序情势创设三个DataTable,但常见选拔DataSet和概念在System.Data.奥莱Db或System.Data.SqlClient命名空间中的类型,以动态得到二个DataTable。表A-7讲述了DataTable中的一些中坚属性。

1.概念

  DataSet是ADO.NET的中坚概念。能够把DataSet当成内部存款和储蓄器中的数据库,DataSet是不借助于数据库的独立数据集合。所谓独立,就是说,即使断开数据链路,也许关闭数据库,DataSet还是是可用的,DataSet在中间是用XML来叙述数据的,由于XML是一种与平台非亲非故、与语言非亲非故的数额描述语言,而且能够描述复杂关系的多少,比如父子关系的多少,所以DataSet实际上可以包容全体复杂性关系的数据,而且不再依靠于数据库链路。大家得以把DataSet当成内部存款和储蓄器数据库,DataSet里面能够储存三个表(DataTable);大家称DataSet为数据集对象。

  DataTable【澳门葡京备用网址】伊始,DataTable一些选择办法。是叁个权且保存数据的网格虚拟表(表示内部存款和储蓄器中数据的三个表。)。DataTable是ADO
dot net 库中的核心目标。它可以被运用在 VB 和 ASP
上。它并非代码就足以省略的绑定数据库。它富有微轻风格的用户界面。其余应用DataTable的指标包涵DataSet和DataView,DataTable中存放的是一行行的数额,这一行行的多少正是DataRow
的数组;大家称DataTable 为数据表对象DataRow是DataTable中的数据行,他个中有隐含三个数据列,每个列能够储存区别品种的值。

  2,定义一个DataTable

  1. 应用Find方法寻找有主键的表

表A-7  DataTable的属性

2.DataSet 的宽广使用

在C# 中 DataSet 存在于System.Data
命名空间下,类似于java中包的途径。DataSet 有二种事列格局,代码如下

using System;using System.Data;namespace testData{    class Program    {        static void Main(string[] args)        {            DataSet ds1 = new DataSet();//无构造实例,不指定DataSetName            Console.WriteLine(ds1.DataSetName);            DataSet ds2 = new DataSet("MySet");//一个构造实例,指定DataSetName            Console.WriteLine(ds2.DataSetName);            Console.ReadKey();        }    }}

澳门葡京备用网址 1

DataSet 常用的习性就四个,Tables ,这里就只是多解释了,如下列出DataSet
.Tables 如下常用属性:

//
ds.Tables.Count;//获取数据集中存在的表的个数
//
ds.Tables.Add(new DataTable;//添加二个表(DataTable)到数据集

//DataTable[] array = { new DataTable(), new DataTable(), new
DataTable() };

//ds.Tables.AddRange;//添加二个表(DataTable)的数组到数据集

//ds.Tables.Remove();//删除一个表

//ds.Tables.RemoveAt();//依照表的目录从数据集删除一个表

//ds.WriteXml()//将xml 文件写入到DataSet 数据汇总

//ds.ReadXml()//将三个xml 文件读取到数码集中

//ds.Tables.CanRemove()//验证是不是能够去除三个集聚中的对象。

DataTable dt=new DataTable();

分三种情况:

DataTable属性

意    义

CaseSensitive

表明表中的字符串比较是否区分大小写。默认的值为false

ChildRelations

返回DataTable的子关系(DataRelationCollection)的集合

Columns

返回属于这个表的列的集合

Constraints

获得表约束的集合(ConstraintCollection)

DataSet

获得包含这个表的DataSet

DefaultView

获得表的自定义视图,它可能包含已过滤的视图或游标位置

MinimumCapacity

获得或设置表中行的初始数目(默认为25)

ParentRelations

获得这个DataTable上的父关系的集合

PrimaryKey

获得或设置作为数据表主键的列数组

Rows

返回属于这个表的行集合

TableName

获得或设置表的名称。这个属性还可以被指定为构造函数的参数

图A-7得以帮助您越发了然地了然DataTable的显要部分。要知道那并不是二个观念的类层次结构,表达项目之间is-a关系(例如,DataRow不是派生自DataRowCollection)。那么些图只是展示了DataTable的大旨项之间的has-a逻辑关系(例如,DataRowCollection有一部分DataRow类型)。

3.DataTable 的宽泛使用

DataTable 和DataSet
命名空间一样,实例化的艺术有二种,但是常用的就二种,第三种内定了表空间;那里但是多解释,以后我们来看下三种常用实例格局;

实例化1 DataTable dt0 = new DataTable();//没有点名表名,私下认可表名为
NewDataTable
实例化2 DataTable dt1 = new DataTable;//钦点表名

using System;using System.Data;namespace testData{    class Program    {        static void Main(string[] args)        {            DataSet ds = new DataSet;            DataTable dt = new DataTable;            ds.Tables.Add;//把一个表加入到数据集中            Console.WriteLine(ds.Tables.Count);            Console.WriteLine(ds.Tables[0].TableName);            Console.Read();        }    }}

  通过上边包车型客车代码,大家能够见见,我们采纳DataSet
的Add方法将二个DataTable 加入数据集。

在前文概述中,大家就说了DataTable
是二个数据表,数据表就要有表头,那么一旦创立3个表头呢,上代码

 DataSet ds = new DataSet("Set");            DataTable dt = new DataTable("User");            dt.Columns.Add(new DataColumn("ID", typeof(int)));//设定表头ID            dt.Columns.Add("Name", typeof(string));//设定表头Name            dt.Columns.Add("Age", Type.GetType("System.Int32"));//设定表头Name            for (int i = 0; i < dt.Columns.Count; i++)            {                Console.WriteLine("遍历表头方式1_____"+dt.Columns[i]);                            }            foreach (var item in dt.Columns)            {                Console.WriteLine("遍历表头方式2~~~" + item);            }            ds.Tables.Add;//把一个表加入到数据集中            Console.WriteLine("当前数据集中有“"+ ds.Tables.Count + "”个表   ");            Console.WriteLine("当前数据集的表名   " + ds.Tables[0].TableName);            Console.Read();

如此那般一张空的报表,大家就有了,下面正是大家什么样添加几个数据行了,别急,我们先来看下DataRow的利用。关于成立叁个数量行我们会在高档部分解释。

此地大约表明下DataTable 的任何用法

1 DataTable的复制和数组复制是同一的选拔,就是全然Copy 二个措施。

2.DataTable 的仿造,克隆指的是克隆表结构,含主键列

3.我们选取Merge 合并连个表

下列出上诉简要代码

static void Main(string[] args)        {            DataTable dt = new DataTable();            dt.Columns.AddRange(                    new DataColumn[]                    {                        new DataColumn("ID",typeof(int)),                        new DataColumn("UserName",typeof(string)),                        new DataColumn("Age",typeof(int))                    }                );            dt.Rows.Add(1, "xiaoli", 33);            dt.PrimaryKey = new DataColumn[] { dt.Columns[0] };//给哪一列设置主键            DataTable dtCopy = dt.Copy();//复制表,连数据和表结构一起复制            DataTable dtClone = dt.Clone();//克隆一个表的结构,不包含数据            DataRow dr= dtClone.NewRow();            dr[0] = 2;            dr[1] = "xiaomei";            dr[2] = 23;            dtClone.Rows.Add;            dt.Merge;//当主键不同的时候,就会出现合并到一起,如果相同以被合并的表为主,表结构不一致也可以合并,这里就不掩饰了            Console.WriteLine(dt.Rows.Count);            Console.Read();;        }

 3,为DataTable创建列

(1) 主键唯有三个字段
DataRow dr = dt.Rows.Find(“主键字段的值”);

澳门葡京备用网址 2

图A-7  DataTable的集合

4.DataRow的宽泛使用

DataRow 的创造格局,唯有一种,因为我们net
中设定了DataRow不容许实例化,只可以通过
DataTable.NewRow()来创制,如DataRow dr =
dt.NewRow();那样大家就得到了3个空行对象。

4.1 怎么样给DataTable 扩充行数据吧??看如下代码

using System;using System.Data;namespace testData{    class Program    {        static void Main(string[] args)        {            DataSet ds = new DataSet("Set");            DataTable dt = new DataTable("User");            dt.Columns.Add(new DataColumn("ID", typeof(int)));//设定表头ID            dt.Columns.Add("Name", typeof(string));//设定表头Name            dt.Columns.Add("Age", Type.GetType("System.Int32"));//设定表头Name            for (int i = 0; i < dt.Columns.Count; i++)            {                Console.WriteLine("遍历表头方式1_____"+dt.Columns[i]);                            }            foreach (var item in dt.Columns)            {                Console.WriteLine("遍历表头方式2~~~" + item);            }            DataRow dr = dt.NewRow();            dr["ID"] = 1;            dr["Name"] = "xiaomeng";            dr["age"] = 21;            dt.Rows.Add;            ds.Tables.Add;//把一个表加入到数据集中            for (int i = 0; i < dt.Rows.Count; i++)            {                DataRow item= dt.Rows[i];                Console.WriteLine(item["name"]+"今年"+item["age"]+"岁了");            }            Console.WriteLine("当前数据集中有“"+ ds.Tables.Count + "”个表   ");            Console.WriteLine("当前数据集的表名   " + ds.Tables[0].TableName);            Console.Read();        }    }}

大家许多程序员在开发的时候,都会认为那就把一个数额行添加到DataTable
里面了,其实不是如此的?具体看高级部分

//1.创建空列
DataColumn dc = new DataColumn();
dt.Columns.Add(dc);
//2.创建带列名和类型名的列
dt.Columns.Add("column0", typeof(String));
//3.通过列架构添加列
DataColumn dc = new DataColumn("column1", typeof(String));
dt.Columns.Add(dc);

(2) 主键有五个字段
比如说,表的主键由1个整型字段ID和贰个字符类型自动Name组成,以下代码查找满意ID=10且Name=”张三”条件的笔录。
Object[] objs = new Object[]{10,”张三”};
dr = dt.Rows.Find(objs);

创设三个全体的DataTable

于今您曾经掌握到最基础的事物,让大家来看一个完整的成立并操作内存中的数据表的例证。如果你想营造叁个来得Cars数据库中当前存货的DataTable。这几个Inventory表有两个列:CarID,Make,Color和PetName。同时,CarID列作为那几个表的主键(PK)并支持自动递增。PetName列允许null值(很不满,并不是种种人都和大家一致保养本身的车)。图A-8显示了该表。

澳门葡京备用网址 3

图A-8  存货DataTable

全体进度将从创设叁个新的DataTable类型开首。创制完这些类型后,能够把这一个表的名号钦点为构造函数的参数。可以用那个称号从所在DataSet引用这么些表,如下所示:

// Create a new DataTable.

DataTable inventoryTable = new DataTable(“Inventory”);

下一步是以编制程序格局选择DataColumnCollection的Add()方法插入每列(使用DataTable.Columns属性访问)。下边包车型大巴逻辑将CarID、Make、Color和PetName列添加到当前DataTable中(每列的主干数据类型使用DataType属性设置):

// DataColumn var.

DataColumn myDataColumn;

// Create CarID column and add to table.

myDataColumn = new DataColumn();

myDataColumn.DataType = Type.GetType(“System.Int32”);

myDataColumn.ColumnName = “CarID”;

myDataColumn.ReadOnly = true;

myDataColumn.AllowDBNull = false;

myDataColumn.Unique = true;

// Set the autoincrement behavior.

myDataColumn.AutoIncrement = true;

myDataColumn.AutoIncrementSeed = 1000;

myDataColumn.AutoIncrementStep = 10;

inventoryTable.Columns.Add(myDataColumn);

// Create Make column and add to table.

myDataColumn = new DataColumn();

myDataColumn.DataType = Type.GetType(“System.String”);

myDataColumn.ColumnName = “Make”;

inventoryTable.Columns.Add(myDataColumn);

// Create Color column and add to table.

myDataColumn = new DataColumn();

myDataColumn.DataType = Type.GetType(“System.String”);

myDataColumn.ColumnName = “Color”;

inventoryTable.Columns.Add(myDataColumn);

// Create PetName column and add to table.

myDataColumn = new DataColumn();

myDataColumn.DataType = Type.GetType(“System.String”);

myDataColumn.ColumnName = “PetName”;

myDataColumn.AllowDBNull = true;

inventoryTable.Columns.Add(myDataColumn);

在添加行以前,花点时间来安装一下表的主键。能够对需求设置的列设定DataTable.PrimaryKey属性。由于作为表主键的列恐怕无休止1个,因而要明了PrimaryKey的性质必要3个DataColumn类型的数组。要是CarID列正是Invetory表主键的无比组成部分,如下所示:

// Make the ID column the primary key column.

DataColumn[] PK = new DataColumn[1];

PK[0] = inventoryTable.Columns[“CarID”];

inventoryTable.PrimaryKey = PK;

末尾但一定首要的是,您要求往表中加上有效的数目。假如有三个确切的ArrayList保存Car类型,能够用如下的章程把它填充到表中:

// Iterate over the array list to make rows (remember, the ID is

// autoincremented).

foreach(Car c in arTheCars)

{

DataRow newRow;

newRow = inventoryTable.NewRow();

澳门葡京备用网址,newRow[“Make”] = c.make;

newRow[“Color”] = c.color;

newRow[“PetName”] = c.petName;

inventoryTable.Rows.Add(newRow);

}

为了显得新的地头内部存款和储蓄器表,假定有二个Windows
Forms应用程序,包涵1个显示DataGrid的主窗体。如第叁1章所示,DataSource属性用于把DataTable绑定到GUI上。输出结果如图A-9所示。

澳门葡京备用网址 4

图A-9  把DataTable绑定到DataGrid上

那时通过点名要修改的列名称的字符串来添加行。当然还是能钦定列的数字索引,在急需迭代每一个列时,它尤其有用。那样,后面包车型客车代码能够革新为如下的代码(获得平等的末梢结出):

foreach(Car c in arTheCars)

{

// Specify columns by index.

DataRow newRow;

newRow = inventoryTable.NewRow();

newRow[1] = c.make;

newRow[2] = c.color;

newRow[3] = c.petName;

inventoryTable.Rows.Add(newRow);

}

5.归结应用之CRUD

5.1新增

我们在DataRow中是有壹性格格叫RowState
叫做行状态,行状态主要有如下值:“UnChange”,“Added”,“Modified”,“Deleted”
删除中的数据,如下图,下图为地方添加行数据的代码,断点调节和测试。

澳门葡京备用网址 5

通过上诉分析,大家会发觉,添加的数目,并不曾付诸到内部存款和储蓄器上,只是程序一时半刻存款和储蓄的。那么我们怎么提交呢,看如下代码。

using System;using System.Data;namespace testData{    class Program    {        static void Main(string[] args)        {            DataSet ds = new DataSet;            DataTable dt = new DataTable;            dt.Columns.Add(new DataColumn("ID", typeof;//设定表头ID            dt.Columns.Add("Name", typeof;//设定表头Name            dt.Columns.Add("Age", Type.GetType("System.Int32"));//设定表头Name            for (int i = 0; i < dt.Columns.Count; i++)            {                Console.WriteLine("遍历表头方式1_____"+dt.Columns[i]);                            }            foreach (var item in dt.Columns)            {                Console.WriteLine("遍历表头方式2~~~" + item);            }            DataRow dr = dt.NewRow();            dr["ID"] = 1;            dr["Name"] = "xiaomeng";            dr["age"] = 21;            dt.Rows.Add;            dt.AcceptChanges();//提交数据            ds.Tables.Add;//把一个表加入到数据集中            for (int i = 0; i < dt.Rows.Count; i++)            {                DataRow item= dt.Rows[i];                Console.WriteLine(item["name"]+"今年"+item["age"]+"岁了");            }            Console.WriteLine("当前数据集中有“"+ ds.Tables.Count + "”个表   ");            Console.WriteLine("当前数据集的表名   " + ds.Tables[0].TableName);            Console.Read();        }    }}

  澳门葡京备用网址 6

付出代码DataTable.AcceptChanges();那么有内部存款和储蓄器的交由是还是不是也应该有内存的回滚,那里可是多介绍了,大家来看下

DataTable 新增行数据的时候状态 为 Added
,那么些时候可以选拔DataTable的.AcceptChanges()方法开始展览提交,可以使用RejectChanges()函数实行回滚。

DataTable 修改行数据的时候状态 为
Modified,那几个时候能够动用DataTable的.AcceptChanges()方法进行提交,能够选择RejectChanges()函数实行回滚。

DataTable 删除行数据的时候状态 为
Deleted,这几个时候能够运用DataTable的.AcceptChanges()方法开始展览付出,能够行使RejectChanges()函数进行回滚。

下边来看下增删改的代码

using System;using System.Data;namespace testData{    class Program    {        static void Main(string[] args)        {            DataTable dt = new DataTable();            DataColumn[] arrayColumn = {                new DataColumn("id", typeof(int)),                new DataColumn("name", typeof(string)),                new DataColumn("age", typeof(int)),                new DataColumn("sex", typeof(string))            };              dt.Columns.AddRange(arrayColumn);            Console.WriteLine("---------------------------新增---------------------------");            DataRow dr0 = null;            for (int i = 0; i < 5; i++)            {                dr0 = dt.NewRow();                dr0[0] = i;                dr0[1] = "xiaoming"+i;                dr0[2] = 20+i+new Random().Next(1,10);                dr0[3] = new Random().Next(i, 200)%3==0?"男":"女";                               dt.Rows.Add;            }            Console.WriteLine("新增没有提交打印");            Print;            Console.WriteLine("状态==================" + dr0.RowState);            dt.AcceptChanges();//新增提交            Console.WriteLine("新增提交后打印");            Print;            Console.WriteLine("状态==================" + dr0.RowState);            Console.WriteLine("---------------------------修改---------------------------");            DataRow dr1 = dt.Rows[0];            dr1["name"] = "wbcsky";            Console.WriteLine("修改没有提交打印");            Print;            Console.WriteLine("状态==================" + dr1.RowState);            dt.AcceptChanges();//新增提交            Console.WriteLine("修改提交后打印");            Print;            Console.WriteLine("状态==================" + dr1.RowState);            Console.WriteLine("---------------------------删除---------------------------");            DataRow dr2=dt.Rows[0]  ;//删除第一条            dr2.Delete();//这里没有使用dt.rmove 和dt.rmoveat,因为这两个方法直接提交了            Console.WriteLine("删除没有提交打印");            Print;            Console.WriteLine("状态==================" + dr2.RowState);            dt.AcceptChanges();//新增提交            Console.WriteLine("删除提交后打印");            Print;            Console.WriteLine("状态==================" + dr2.RowState);            Console.Read();        }        private static void Print(DataTable dt)        {            foreach (DataRow item in dt.Rows)            {                string msg = "";                try                {                    msg = $"id={ item[0]},name={item[1]},age={item[2]},sex={item[3]}";                }                catch (Exception e)                {                     msg =e.Message;                                   }                              Console.WriteLine;            }        }    }}

进行结果如下图

澳门葡京备用网址 7

 4,为DataTable创建行

贰 、使用DataView筛选数据

1 操作DataTable:删除行

一经您想从数额表中删除一行该怎么办吧?我们可以调用DataRowCollection类型的Delete()方法。只要钦赐要去除行的目录(恐怕时DataRow)就能够。如若你曾经依据图A-10更新了GUI。

澳门葡京备用网址 8

图A-10  从贰个DataTable中删除行

倘诺您查看前边的图,就会小心到由于内定了DataTable的第1行,CarID1020就被删去掉了。下边新按钮的单击事件处理逻辑正是剔除内部存款和储蓄器中DataTable表中的钦赐行。

// Remove this row from the DataRowCollection.

protected void btnRemoveRow_Click (object sender, System.EventArgs e)

{

try

{

inventoryTable.Rows[(int.Parse(txtRemove.Text))].Delete();

inventoryTable.AcceptChanges();

}

catch(Exception ex)

{

MessageBox.Show(ex.Message);

}

}

莫不将那个Delete()方法命名为马克edAsDeletable()更好一些,因为这一行只有到DataTable.AcceptChanges()方法调用后才会真的被剔除。实际上,Delete()只是简单地设定1个标志表示“I am ready
to die when my table tells me”。还要掌握,假设有一行被标记为除去,那么DataTable大概会在AcceptChanges()调用此前拒绝那些改动,如下所示:

// Mark a row as deleted, but reject the changes.

protected void btnRemoveRow_Click (object sender, System.EventArgs e)

{

inventoryTable.Rows[txtRemove.Text.ToInt32()].Delete();

// Do more work. . .

inventoryTable.RejectChanges(); // Restore RowState.

}

6.归咎运用之筛选排序

我们只要想给地点的表排序,要怎么排序呢?????,其实排序大家利用DataTable.Select
方法就足以,我们看下怎么利用

澳门葡京备用网址 9

咱俩会看到select
方法有多个重载,大家只用多个参数的和连个参数的,在那之中2个参数的是赛选,七个参数的率先个参数为筛选,第1个为排序

using System;using System.Data;namespace testData{    class Program    {        static void Main(string[] args)        {            DataTable dt = new DataTable();            DataColumn[] arrayColumn = {                new DataColumn("id", typeof(int)),                new DataColumn("name", typeof(string)),                new DataColumn("age", typeof(int)),                new DataColumn("sex", typeof(string))            };              dt.Columns.AddRange(arrayColumn);                       DataRow dr0 = null;            for (int i = 0; i < 5; i++)            {                dr0 = dt.NewRow();                dr0[0] = i;                dr0[1] = "xiaoming"+i;                dr0[2] = 20+i+new Random().Next(1,5);                dr0[3] = new Random().Next(i, 200)%3==0?"男":"女";                               dt.Rows.Add;            }            Console.WriteLine("---------------------------筛选之前---------------------------");            Print;            DataRow[] rowArr=   dt.Select("age >25", " age desc");            Console.WriteLine("---------------------------筛选之后按年龄排序---------------------------");            PrintRow;            Console.Read();        }        private static void PrintRow(DataRow[] rowArr)        {            foreach (DataRow item in rowArr)            {                string msg = "";                try                {                    msg = $"id={ item[0]},name={item[1]},age={item[2]},sex={item[3]}";                }                catch (Exception e)                {                    msg = e.Message;                }                Console.WriteLine;            }        }        private static void Print(DataTable dt)        {            foreach (DataRow item in dt.Rows)            {                string msg = "";                try                {                    msg = $"id={ item[0]},name={item[1]},age={item[2]},sex={item[3]}";                }                catch (Exception e)                {                     msg =e.Message;                                   }                              Console.WriteLine;            }        }    }}
//1.创建空行
DataRow dr = dt.NewRow();
dt.Rows.Add(dr);
//2.创建空行
dt.Rows.Add();
//3.通过行框架创建并赋值
dt.Rows.Add("小明",18);//Add里面参数的数据顺序要和dt中的列的顺序对应 
//4.通过复制dt2表的某一行来创建
dt.Rows.Add(dt2.Rows[i].ItemArray);

DataView能够看成DataTable中的记录加上某种条件后收获的数目。DataView依附于DataTable,逐个DataTable都至少有几个DataView。数据绑定中央控制件绑定到的其实不是DataTable,而是DataTable的DefaultView。

2 操作DataTable:应用过滤器和排序依次

唯恐你想查看DataTable数据的1个子集,能够用某些过滤条件来钦赐。例如,假使您只想从这么些内部存储器中的Inventory表中观望有些品牌的小车该如何是好啊?DataTable类上的Select()方法恰好提供了那么些成效。再一次更新您的GUI,此次允许用户内定一个字符串来表示他们感兴趣查看的车的牌子(图A-11)。

澳门葡京备用网址 10

图A-11  钦命三个过滤器

以此Select()方法已经被重载多次,以提供分裂的精选语义。传递给Select()的最基本参数能够是一个包含有有个别条件操作的字符串。首先看一下新按钮的单击事件处理逻辑:

protected void btnGetMakes_Click (object sender, System.EventArgs e)

{

// Build a filter based on user input.

string filterStr = “Make='” + txtMake.Text + “‘”;

// Find all rows matching the filter.

DataRow[] makes = inventoryTable.Select(filterStr);

// Show what we got!

if(makes.Length = = 0)

MessageBox.Show(“Sorry, no cars. . .”, “Selection error!”);

else

{

string strMake = null;

for(int i = 0; i < makes.Length; i++)

{

DataRow temp = makes[i];

strMake += temp[“PetName”].ToString() + “”n”;

}

MessageBox.Show(strMake, txtMake.Text + ” type(s):”);

}

}

此刻,您首先建立贰个依据相关的文件框值的过滤器条件。固然您钦赐克莱斯勒,那么过滤器条件正是Make = ‘劳斯莱斯’。把那些过滤器发送给Select()方法后,就会博得3个DataRow类型的数组,这些数组表示了合营每一个符合过滤条件的行,如图A-12所示。

澳门葡京备用网址 11

图A-12  过滤后的多少

能够用见惯司空有关的操作符组成五个过滤字符串。例如,若是想寻找全体ID大于1030的车如何是好啊?您能够编写制定如下的代码(见图A-13的输出结果):

// Now show the pet names of all cars with ID greater than 1030.

DataRow[] properIDs;

string newFilterStr = “ID > ‘1030’”;

properIDs = inventoryTable.Select(newFilterStr);

string strIDs = null;

for(int i = 0; i < properIDs.Length; i++)

{

DataRow temp = properIDs[i];

strIDs += temp[“PetName”].ToString()

+ ” is ID ” + temp[“ID”] + “”n”;

}

MessageBox.Show(strIDs, “Pet names of cars where ID > 1030”);

澳门葡京备用网址 12

图A-13  钦赐3个数据范围

依傍标准SQL语法编写过滤逻辑。为了求证那或多或少,假诺想基于pet名称的字母顺序来取得前面Select()命令的结果。在SQL术语中,那会被诠释为基于PetName列举行排序。幸运的是,Select()方法已经被重载过,它能够传递2个排序条件,如下所示:

makes = inventoryTable.Select(filterStr, “PetName”);

这么会回去图A-14所示的音信。

澳门葡京备用网址 13

图A-14  已排序的数额

设若你想用降序来对结果排序,调用Select(),如下所示:

// Return results in descending order.

makes = inventoryTable.Select(filterStr, “PetName DESC”);

诚如的话,排序字符串是列名后随即“ASC”(升序,默许设置)或“DESC”(降序)。假设须要的话,能够用逗号来把四个列分别排序。

 5,DataTable的取值和赋值

DataView常用的数额筛选方法有:

3 操作DataTable:更新行

你供给精通的有关DataTable的末梢一个上边便是什么用新值更新已有的行。多少个措施正是先用Select()方法赢得符合给定过滤条件的行。一旦获得那一个DataRow,就对它们作相应的改动。例如,假定有3个新按钮在被单击后,搜索DataTable中有着Make为路虎的行。一旦标识这个项后,就可以把Make从“罗密欧”改为“Colt”。

// Find the rows you want to edit with a filter.

protected void btnChange_Click (object sender, System.EventArgs e)

{

// Build a filter.

string filterStr = “Make=’BMW'”;

string strMake = null;

// Find all rows matching the filter.

DataRow[] makes = inventoryTable.Select(filterStr);

// Change all Beemers to Colts!

for(int i = 0; i < makes.Length; i++)

{

DataRow temp = makes[i];

strMake += temp[“Make”] = “Colt”;

makes[i] = temp;

}

}

以此DataRow类也提供了Begin艾德it()、EndEdit()和Cancel艾德it()方法,这一个办法能够在别的有关的辨证规则被暂且挂起时对二个行的剧情开始展览编制。在头里的逻辑中,每一行都用1个派遣作了求证(而且一旦从DataRow中抓获事件的话,那些事件会在每一次修改时接触)。在对某些DataRow调用Begin艾德it()时,这一行就棉被服装置在编辑形式下。这时你能够依照要求来作些改动,并调用End艾德it()提交修改可能Cancel艾德it()把所作的改动回滚到原先的版本。例如:

// Assume you have obtained a row to edit.

// Now place this row in edit mode’.

rowToUpdate.BeginEdit();

// Send the row to a helper function, which returns a Boolean.

if( ChangeValuesForThisRow( rowToUpdate) )

{

rowToUpdate.EndEdit(); // OK!

}

else

{

rowToUpdate.CancelEdit(); // Forget it.

}

就算你能够无限制地对某一DataRow手动调用这几个办法,但借使把贰个DataGrid绑定到DataTable,那些分子就足以被活动地调用。例如,固然你想从DataGrid中选拔一行实行编制的话,该行就会自动处于编辑形式下。当把难点换来另一行时,就会自行调用End艾德it()。为了测试这些行为,假使您已经手动地使用DataGrid把每一个车更新为有些Make(图A-15)。

尽管今日您想查询全部的BRABUS,音讯对话框会正确地回去全数行,因为涉及到这么些DataGrid的最底层DataTable已经被自动更新了(图A-16)。

澳门葡京备用网址 14            
澳门葡京备用网址 15

图A-15  在DataGrid中编辑行                   图A-16  Inventory DataTable

 

假诺小编想限制取前边的50行,该如何是好呢?
DataRow[] properIDs;
string newFilterStr = “ID > ‘1030’”;
properIDs = inventoryTable.Select(newFilterStr);
即便自身想限制取后边的50行,该如何做呢?

能够用SQL语句达成(select top 50 * from tabalName),最方便,
一旦要用上面的办法,能够给DataTable中插入贰个自增行(index),用它去判断.
也能够那样写.

    private DataTable SelectTop(int top, DataTable dt)
    {
        if (dt.Rows.Count < top) return dt;

        DataTable newTable = new DataTable();
        
        int columns = dt.Columns.Count;
        string[] col = new string[columns];

        //取得要筛选表的兼具列名
        for (int c = 0; c < columns; c++)
        {
            col[c] = dt.Columns[c].ColumnName;            
        }

        //创制新表的组织
        foreach (string columnName in col)
        {
            newTable.Columns.Add(columnName);
        }

        //选用全数行
        DataRow[] rows = dt.Select(“1=1”);
        DataRow newRow;
        for (int i = 0; i < top; i++)
        {
            newRow = newTable.NewRow();
            foreach (string columnName in col)
            {
                newRow[columnName] = rows[i][columnName].ToString();
            }

            newTable.Rows.Add(newRow);
        }
        dt.Dispose();        
        return newTable;
    }

 

//新建行的赋值
DataRow dr = dt.NewRow();
dr[0] = "小明";//通过索引赋值
dr["column1"] = DateTime.Now; //通过名称赋值
//对表已有行进行赋值
dt.Rows[0][0] = "小明"; //通过索引赋值
dt.Rows[0]["column1"] = DateTime.Now;//通过名称赋值
//取值
string name=dt.Rows[0][0].ToString();
string time=dt.Rows[0]["column1"].ToString();
  1. 筛选特定情景的行

 6,DataTable的筛选行和删除行

以下代码找出具有新加的行:
dv.RowStateFilter = DataViewRowState.Added;

//select用法
//筛选姓名列值中有"小"的行的集合(模糊查询),第二句可添加按年龄降序排序
DataRow[] dr = dt.Select("姓名 like '小%'");
DataRow[] drs = dt.Select("姓名 like '小%'", "年龄 DESC");
  1. 使用Sort属性,能够钦定单个或多个列实行排序,如:
    dv.Sort = “Name ASC,ID DESC”;

  2. 利用RowFilter属性动态筛选记录。
    dv.RowFilter = “Name LIKE ‘张%'”;

  3. 使用Find和FindRows在DataView中查找。

//Compute用法

行使那五个章程,是遵照行的排序关键字值来对行实行检索的。

   Object result = dt.Compute(“sum(成绩)”, “年龄>16 and 姓名 like
‘小*'”);

Find方法再次回到三个整数,表示卓越搜索条件的DataRowView的目录。借使多行匹配,只回去二个协作行索引,固然未找到匹配项,重临-1。

 //result为总计出的结果,compute函数的首先个参数一般为聚合函数,后2个参数为筛选标准

若要再次回到匹配多个行的物色结果,能够采纳FindRows方法。它回到DataView中的全部匹配行的DataRowView数组。若是未找到匹配项,DataRowView数组为空。

 

若要使用Find或FindRows方法,必须通过将ApplyDefaultSort设置为true或透过应用DataView对象的Sort属性来钦点排序依次,否则将引发那三个。那三种情势将3个值数组用做输入,该数组的长度与排序依次包括的列数相匹配。当对三个列实行排序时,对象数组的值必须合作在DataView的Sort属性中内定的列的逐条。

//Find用法

对全数单个列排序顺序的DataView调用Find方法。
dv.Sort = “Name”;
int rowIndex = dv.Find(“张三”);
如若Sort属性钦点多个列,则必须遵循Sort属性钦定的依次为各类列传递包蕴搜索值的对象数组。
dv.Sort = “Name,ID”;
DataRowView[] foundRows = dv.FindRows(new Object[]{“张%”,”001″});

dt.PrimaryKey = new DataColumn[] { dt.Columns[“学号”] };

原文

 DataRow dr1 = dt.Rows.Find(“004”);

//Find用法供给datatable有主键,是一种按主键搜寻一行数据的措施

 

 

 

//删除行

//使用DataTable.Rows.Remove(DataRow)方法

dt.Rows.Remove(dt.Rows[0]);

//使用DataTable.Rows.RemoveAt(index)方法

dt.Rows.RemoveAt(0);

//使用DataRow.Delete()方法

dt.Row[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);

}

 7,DataTable的复制和排序

 

//复制表,同时复制了表结构和表中的数据
DataTable dtNew = new DataTable();
dtNew = dt.Copy();

//克隆表,只是复制了表结构,不包括数据
DataTable dtNew = new DataTable();
dtNew = dt.Clone();

//排序
DataView dv = dt.DefaultView;//获取表视图
dv.Sort = "ID DESC";//按照ID倒序排序
dv.ToTable();//转为表

 

  

 

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website