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

问题描述 投票:0回答:4

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

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);
}

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

c# datatable
4个回答
11
投票

我认为当行已经在表中时不可能触发

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);
    }
}

2
投票

我对@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);
}

1
投票

我认为有一种更简单的方法,不需要循环遍历所有行。 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);

0
投票

这对我有用,我试图从另一个表中获取唯一值并让它们有一个新的 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);
© www.soinside.com 2019 - 2024. All rights reserved.