我有以下代码将自动编号列添加到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。有没有办法为已存在的行设置自动编号值?
答案 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']);