介绍
是一个临时保存数据的网格虚拟表,表示内存中数据的一个表,是一个二维表,也是一个后台数据源和前台显示之间的适配器
包:System.Data
创建对象
创建一个没有名子的空表
DataTable dt = new DataTable();
创建一个名为 user 的空表
DataTable dt = new DataTable("user");
添加列
创建对象后,要添加列
方式一
仅指定列名
DataColumn dc = dt.Columns.Add("name");
方式二
指定列名、类型
DataColumn dc = dt.Columns.Add("ID",Type.GetType("System.Int32"));
方式三
通过添加 DataColumn 方式实现:
// 创建table的第一列
DataColumn priceColumn =new DataColumn();
// 添加到表中
table.Columns.Add(priceColumn);
//列名称
priceColumn.ColumnName ="price";
//该列的数据类型
priceColumn.DataType = System.Type.GetType("System.Decimal");
或者
DataColumn column = new DataColumn("列名", typeof(数据类型));
常用列属性(DataColumn)
添加列时可通过 DataColumn 的属性自定义列行为,常用属性如下:
| 属性名 | 说明 |
|---|---|
ColumnName |
列的名称(唯一标识,不可重复)。 |
DataType |
列的数据类型(如 typeof(int)、typeof(string) 等)。 |
AllowDBNull |
是否允许为空值(默认 true)。 |
DefaultValue |
列的默认值(新增行时自动填充)。 |
Unique |
列的值是否唯一(默认 false,设置为 true 时不允许重复值)。 |
AutoIncrement |
是否自动递增(适合主键,默认 false)。 |
AutoIncrementSeed |
自动递增的起始值(配合 AutoIncrement 使用)。 |
AutoIncrementStep |
自动递增的步长(默认 1)。 |
Caption |
列的显示标题(用于 UI 展示,与 ColumnName 区分)。 |
dc.DefaultValue =50;//该列得默认值
dc.AutoIncrement =true;//自动增加
dc.AutoIncrementSeed =1;//起始为1
dc.AutoIncrementStep =1;//步长为1
dc.AllowDBNull =false;
支持的数据类型
DataColumn 支持的常见数据类型对应 C# 类型如下:
| C# 类型/关键字 | 说明 |
|---|---|
string |
字符串类型 |
int/Int32 |
32位整数 |
long/Int64 |
64位整数 |
decimal |
高精度小数(适合金额) |
double |
双精度浮点数 |
float |
单精度浮点数 |
bool |
布尔值(true/false) |
DateTime |
日期时间类型 |
byte[] |
二进制数据(如图片、文件) |
修改列名
1. 通过列名获取列并修改
dt.Columns["StuID"].ColumnName = "学号";
2. 通过索引获取列并修改(索引从 0 开始)
dt.Columns[1].ColumnName = "姓名";
修改列类型
不支持修改列类型,只能先删除列,再创建列
删除列
dt.Columns.Remove("ID");
添加数据
方式一
添加数组方式
tblDatas.Rows.Add(new object[] { "a", "b", "c" });
方式二
创建 DataRow 对象方式
DataRow dr = dt.NewRow();
dt.Rows.Add(dr); // 必须有此行代码,否则没有行记录
根据列索引指定值
dr[0] = "1";
dr[1] = "张三";
方式三:根据列名赋值
创建 DataTable 并定义列(先有结构才能加数据)
DataTable dt = new DataTable("学生表");
dt.Columns.Add("学号", typeof(int));
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("年龄", typeof(int));
dt.Columns.Add("入学日期", typeof(DateTime));
通过列名赋值:
// 创建行
DataRow row = dt.NewRow();
// 将行添加到表中
dt.Rows.Add(row);
row["学号"] = 1001; // 通过列名赋值
row["姓名"] = "张三";
row["年龄"] = 20;
row["入学日期"] = new DateTime(2023, 9, 1);
修改数据
dt.Rows[0]["字段名"] = "测试"
删除行
方式一
删除 DataRow 对象
dt.Rows.Remove(dt.Rows[0]);
方式二
删除行索引
//使用DataTable.Rows.RemoveAt(index)方法
dt.Rows.RemoveAt(0);
方式三
//使用DataRow.Delete()方法
dt.Row[0].Delete();
遍历行
for(int i = 0 ; i < dt.Rows.Count ; i++)
{
string strName = dt.Rows[i]["字段名"].ToString();
}
foreach(DataRow dr in dt.Rows)
{
object value = dr["ColumnsName"];
}
遍历列
foreach(DataRow dr in dt.Rows)
{
for(int i=0;i<dt.Columns.Count;i++)
{
dr[i];
}
}
筛选
筛选DataTable中的数据,使用 Select() 方法
- Select(string):获取由与筛选条件匹配的所有
DataRow对象组成的数组。 - Select(string,string):以指定排序顺序,获取由与筛选条件匹配的所有
DataRow对象组成的数组。
返回值:Select 方法返回 DataRow 对象数组。 Select 接受筛选表达式、排序表达式。
DataRow[] drArr = dt.Select("C1='abc'");//查询(如果Select内无条件,就是查询所有的数据)
//还可以这样操作:
DataRow[] drArr1 = dt.Select("C1 LIKE 'abc%'");//模糊查询(如果的多条件筛选,可以加 and 或 or )
//选择column1列值为空的行的集合
DataRow[] drs = dt.Select("column1 is null");
DataRow[] drArr2 = dt.Select("'abc' LIKE C1 + '%'", "C2 DESC");//另一种模糊查询的方法
DataRow[] drArr3 = dt.Select("C1='abc'", "C2 DESC");//排序
表格复制
克隆表,只是复制了表结构,不包括数据
DataTable dtNew = new DataTable();
dtNew = dt.Clone();
复制表,同时复制了表结构和表中的数据
DataTable dtNew = new DataTable();
dtNew = dt.Copy();
dtNew.Clear() //清空数据
dtNew.Rows.Clear();//清空表数据
dtNew.ImportRow(dt.Rows[0]);//将DataRow复制到DataTable中,保留任何属性设置以及初始值和当前值
参考:
https://www.cnblogs.com/wordgao/p/4928150.html
https://blog.csdn.net/qq_43246722/article/details/126749418