Лучший способ добавить новый столбец с последовательной нумерацией в существующей таблице данных - PullRequest
3 голосов
/ 30 ноября 2010

У меня есть непустые данные. Каков наилучший способ добавить еще один столбец с последовательной нумерацией, начиная с 1.

Я попробовал следующий код. Но не сработало.

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

Поможет ли настройка какого-либо выражения в этом сценарии?

Заранее спасибо

Ответы [ 3 ]

6 голосов
/ 30 ноября 2010

Я думаю, что вы могли бы добиться этого, используя 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 table вместо исходного dt.Не элегантное решение, но должно работать.

1 голос
/ 30 ноября 2010

код ниже работал у меня

Код отредактирован

        // 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++;
            }
        }
    }
0 голосов
/ 30 ноября 2010

Для этого вам нужно будет создать совершенно новую таблицу данных и вручную вручную скопировать каждую строку из старой таблицы в новую.К сожалению.

...