C# DataTable类

定义

DataTable是C#中的一个类,表示内存中数据的一个表,命名空间为:System.Data

public class DataTable : System.ComponentModel.MarshalByValueComponent, System.ComponentModel.IListSource, System.ComponentModel.ISupportInitialize, System.ComponentModel.ISupportInitializeNotification, System.Runtime.Serialization.ISerializable, System.Xml.Serialization.IXmlSerializabl

创建DataTable

  DataTable dt = new DataTable();

添加DataColumn

            //第一种方式
            dt.Columns.Add("姓名", typeof(string));
            dt.Columns.Add("年龄", typeof(int));
            //第二种方式
            DataColumn dataColumn = new DataColumn();
            dataColumn.ColumnName = "籍贯";
            dataColumn.DataType = typeof(string);
            dt.Columns.Add(dataColumn);

添加DataRow

            //添加DataRow
            //第一种方式
            DataRow dr1 = dt.NewRow();
            dr1[0] = "小王";
            dr1[1] = 23;
            dr1[2] = "湖北武汉";
            dt.Rows.Add(dr1);
            //第二种方式
            DataRow dr2 = dt.NewRow();
            dr2["姓名"] = "小李";
            dr2["年龄"] = 21;
            dr2["籍贯"] = "福建福州";
            dt.Rows.Add(dr2);
            //选定一种方式之后,可以使用循环添加行
            for(int i =0; i<100;i++)
            {
                DataRow dr = dt.NewRow();
                dr["姓名"] = $"小李+{i}号";
                dr["年龄"] = i;
                dr["籍贯"] = "福建福州";
                dt.Rows.Add(dr);
            }

现在查看DataTable,如下图所示:

在这里插入图片描述

读取DataTable中的数据

获取DataColumn的值

            string columnName = (string)dt.Columns[0].ToString();
            Debug.WriteLine($"{columnName}");

dt.Columns[0]中的0表示第一列,dt.Columns[1]就表示第二列

运行结果,如下图所示:

在这里插入图片描述

获取DataRow的值

           //dt.Rows[0][0]表示第一行的第一列的值
           //dt.Rows[0]["年龄"]表示第一行中列名为年龄的值
           //同理,dt.Rows[1][1]表示第二行第二列的值
           //Rows[1]["姓名"]表示第二行列名为姓名的值
            string name1 = (string)dt.Rows[0][0];
            int age1 = (int)dt.Rows[0]["年龄"];
            string name2 = (string)dt.Rows[1]["姓名"];
            int age2 = (int)dt.Rows[1][1];
            Debug.WriteLine($"姓名:{name1},年龄:{age1}\r\n" +
                            $"姓名:{name2},年龄:{age2}\r\n ");

运行结果,如下图所示:

在这里插入图片描述

更新DataTable中的数据

            //更新DataTable第一行的数据
            dt.Rows[0][0] = "小红";
            dt.Rows[0]["年龄"] = 25;
            dt.Rows[0][2] = "福建泉州";

查看dt,发现第一行数据已经更改,如下图所示:

在这里插入图片描述

删除DataTable中的数据

           //使用Delete
           dt.Rows[0].Delete();
           Debug.WriteLine(dt.Rows[0][0].ToString());
           //使用RemoveAt
           dt.Rows.RemoveAt(0);
           Debug.WriteLine(dt.Rows[0][0].ToString());
           //使用Remove
           DataRow dataRow = dt.Rows[0];
           dt.Rows.Remove(dataRow);
           Debug.WriteLine(dt.Rows[0][0].ToString());

运行之后的结果,如下图所示:

在这里插入图片描述

remove与delete的区别

remove是直接删除,delete实际上是先标记为删除,执行AcceptChanges()之后才真的删除,执行RejectChanges()方法可以撤销删除

            dt.AcceptChanges();
            DataRowCollection itemColumns = dt.Rows;
            Debug.WriteLine($"Delete前的RowState:{itemColumns[3].RowState.ToString()}");
            itemColumns[0].Delete();
            itemColumns[3].Delete();
            itemColumns[5].Delete();
            itemColumns[7].Delete();
            Debug.WriteLine($"Delete后的RowState:{itemColumns[3].RowState.ToString()}");

运行到这里时输出的结果,如下图所示:

在这里插入图片描述

查看dt,结果如下图所示:

在这里插入图片描述

执行RejectChanges()方法撤销删除

 itemColumns[3].RejectChanges();

现在再查看dt,结果如下图所示:

在这里插入图片描述

接受更改

dt.AcceptChanges();

现在再看dt,结果所下图所示:

在这里插入图片描述

清空DataTable数据

dt.Clear();