在DataTable已有数据后设置自动编号

我有以下代码将自动编号列添加到DataTable

 public void AddAutoIncrementColumn(DataTable dt) { DataColumn column = new DataColumn(); column.DataType = System.Type.GetType("System.Int32"); column.AutoIncrement = true; column.AutoIncrementSeed = 0; column.AutoIncrementStep = 1; dt.Columns.Add(column); } 

但是,对于表中已有的所有行,此值将为空; 似乎只对添加此列后添加的新行触发AutoIncrement。 有没有办法为已存在的行设置自动编号值?

当行已经在表中时,我认为不可能触发AutoIncrementfunction。 但您可以轻松地手动更新表格:

 public void AddAutoIncrementColumn(DataTable dt) { DataColumn column = new DataColumn(); column.DataType = System.Type.GetType("System.Int32"); column.AutoIncrement = true; column.AutoIncrementSeed = 0; column.AutoIncrementStep = 1; dt.Columns.Add(column); int index = -1; foreach (DataRow row in dt.Rows) { row.SetField(column, ++index); } } 

我改变了@Programnik解决方案。

 DataTable dt = LoadDataTable(); using (DbDataReader dr = dt.CreateDataReader()) { //Get Original Datatable structure dt = dt.Clone(); // Add Auto Increment Column called ID dt.Columns.Add(new DataColumn("ID") { AutoIncrement = true, AllowDBNull = false, AutoIncrementSeed = 1, AutoIncrementStep = 1, DataType = typeof(System.Int32), Unique = true }); // Change Auto Increment Column Ordinal Position to 0 (ie First Column) dt.Columns["TabID"].SetOrdinal(0); // Re-load original Data dt.Load(dr); } 

我认为有一种更简单的方法,不需要循环遍历所有行。 Datatable上有一个名为CreateDataReader的方法。 因此,克隆原始数据表,添加标识列,从原始表创建一个datareader,然后使用数据读取器加载克隆表。 这将在标识列中生成数字,例如

 // original data table DataTable origDT; // create a reader DataReader dr = origDT.CreatDataReader(); //clone original DataTable clonedDT = origDT.Clone(); //add identity column clonedDT.Columns.Add(new DataColumn(){AutoIncrement=true}); //load clone from reader, identity col will auto-populate with values clonedDT.Load(dr);