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

时间:2013-04-23 21:45:42

标签: c# 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。有没有办法为已存在的行设置自动编号值?

3 个答案:

答案 0 :(得分:6)

我认为当行已经在表中时,可能会触发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);
    }
}

答案 1 :(得分: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 (ie First Column)
    dt.Columns["TabID"].SetOrdinal(0);

    // Re-load original Data
    dt.Load(dr);
}

答案 2 :(得分:1)

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

<?= $this->Html->image($user_data->image, ['alt' => 'User image','style' => 'height: 250px; width: 100%; display: block;']); ?>

echo $this->Form->create($user_data, ['type'=>'file']);
echo $this->Form->input('image', ['value' => $user_session['image'], 'type'=>'file']);