【问题标题】:Best way add a new column with sequential numbering in an existing data table在现有数据表中添加具有顺序编号的新列的最佳方法
【发布时间】:2011-05-17 16:24:02
【问题描述】:

我有一个非空数据表。向其中添加从 1 开始的顺序编号的另一列的最佳方法是什么。

我尝试了以下代码。但是没有用。

DataColumn dc = new DataColumn("Col1");
dc.AutoIncrement = true;
dc.AutoIncrementSeed = 1;
dc.AutoIncrementStep = 1;       
dc.DataType = typeof(Int32);
dt.Columns.Add(dc);

在这种情况下设置任何表达式有帮助吗?

提前致谢

【问题讨论】:

  • 添加编辑代码,请验证。

标签: c# .net datatable datacolumn


【解决方案1】:

下面的代码对我有用

代码已编辑

        // Added temp rows so that this solution can mimic actual requirement

        DataTable dt = new DataTable();
        DataColumn dc1 = new DataColumn("Col");
        dt.Columns.Add(dc1);

        for(int i=0;i<10;i++)
        {
            DataRow dr = dt.NewRow();
             dr["Col"] = i.ToString();
             dt.Rows.Add(dr);
        }


        // Added new column with Autoincrement, 

        DataColumn dc = new DataColumn("Col1"); 
        dc.AutoIncrement = true;
        dc.AutoIncrementSeed = 1;
        dc.DataType = typeof(Int32);

        // Handeled CollectionChanged event

        dt.Columns.CollectionChanged += new CollectionChangeEventHandler(Columns_CollectionChanged);
        dt.Columns.Add(dc);

        // After column added demostratation

        DataRow dr1 = dt.NewRow();
            dt.Rows.Add(dr1);



    void Columns_CollectionChanged(object sender, CollectionChangeEventArgs e)
    {
        DataColumn dc = (e.Element as DataColumn);
        if (dc != null && dc.AutoIncrement)
        {
            long i = dc.AutoIncrementSeed;
            foreach (DataRow drow in dc.Table.Rows)
            {
                drow[dc] = i;
                i++;
            }
        }
    }

【讨论】:

  • @Sauradb..谢谢,但这增加了一个新行。对于新添加的列,现有行是空的。我们需要对现有行进行顺序编号。
  • @Suurabh:谢谢。它的工作。但是@Denis 的答案似乎更容易实现。所以我接受了他的回答,并对两个答案都投了反对票。
【解决方案2】:

我认为您可以通过使用仅包含自动增量字段的第二个“帮助”数据表来实现这一点,然后将其与现有数据填充/合并,如下所示:

DataTable dtIncremented  = new DataTable(dt.TableName);
DataColumn dc            = new DataColumn("Col1");
dc.AutoIncrement         = true;
dc.AutoIncrementSeed     = 1;
dc.AutoIncrementStep     = 1;
dc.DataType              = typeof(Int32);    
dtIncremented.Columns.Add(dc);

dtIncremented.BeginLoadData();

DataTableReader dtReader = new DataTableReader(dt);
dtIncremented.Load(dtReader);

dtIncremented.EndLoadData();

然后您将只返回 dtIncremented 表而不是原始 dt。这不是一个优雅的解决方案,但应该可以工作。

【讨论】:

    【解决方案3】:

    您必须为此构建一个全新的数据表,并手动将旧表中的每一行逐一深度复制到新表中。对不起。

    【讨论】:

    • 不需要:你可以处理collectionchanged事件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    相关资源
    最近更新 更多