我有以下代码将自动编号列添加到
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
功能。但您可以轻松手动更新表格:
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 (i.e. First Column)
dt.Columns["ID"].SetOrdinal(0);
//Re-load original Data
dt.Load(dr);
}
我认为有一种更简单的方法,不需要循环遍历所有行。 Datatable 上有一个名为 CreateDataReader 的方法。 因此,克隆原始数据表,添加标识列,从原始表创建数据读取器,然后使用数据读取器加载克隆表。 这将在身份列中生成数字,例如
// 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);
这对我有用,我试图从另一个表中获取唯一值并让它们有一个新的 ID。
DataTable FinalNest = new DataTable();
FinalNest.Columns.Add(new DataColumn("CuttingPlan", typeof(int)) { AutoIncrement = true, AutoIncrementSeed = 1, AutoIncrementStep = 1 });
FinalNest.Columns.Add("Material", typeof(string));
FinalNest.Columns.Add("IncludedPartIDs", typeof(string));
DataTableReader dr = cutPlan.DefaultView.ToTable(true, "Material", "IncludedPartIDs").CreateDataReader();
FinalNest.Load(dr);