Как вставить столбец в набор данных между двумя существующими столбцами? - PullRequest
20 голосов
/ 09 декабря 2008

Я пытаюсь вставить столбец в существующий DataSet, используя C #.

В качестве примера у меня есть DataSet, определенный следующим образом:

DataSet ds = new DataSet();
ds.Tables.Add(new DataTable());
ds.Tables[0].Columns.Add("column_1", typeof(string));
ds.Tables[0].Columns.Add("column_2", typeof(int));
ds.Tables[0].Columns.Add("column_4", typeof(string));

позже в моем коде я хочу вставить столбец между столбцом 2 и столбцом 4.

В DataSets есть методы для добавления столбца, но я не могу найти лучший способ вставить один.

Я бы хотел написать что-то вроде следующего ...

...Columns.InsertAfter("column_2", "column_3", typeof(string))

Конечным результатом должен быть набор данных, содержащий таблицу со следующими столбцами: столбец_1 столбец_2 столбец_3 столбец_4

, а не: column_1 column_2 column_4 column_3, что дает мне метод add

несомненно, должен быть способ сделать что-то подобное.

Редактировать ... Просто хочу уточнить, что я делаю с DataSet, основываясь на некоторых комментариях ниже:

Я получаю набор данных из сохраненного процедура. Я тогда должен добавить дополнительные столбцы к набору данных который затем преобразуется в Excel документ. У меня нет контроля над данные, возвращаемые сохраненным процессом поэтому я должен добавить столбцы после факт.

Ответы [ 4 ]

41 голосов
/ 09 декабря 2008

Для этой цели можно использовать метод DataColumn.SetOrdinal () .

DataSet ds = new DataSet();
ds.Tables.Add(new DataTable());
ds.Tables[0].Columns.Add("column_1", typeof(string));
ds.Tables[0].Columns.Add("column_2", typeof(int));
ds.Tables[0].Columns.Add("column_4", typeof(string));
ds.Tables[0].Columns.Add("column_3", typeof(string));
//set column 3 to be before column 4
ds.Tables[0].Columns[3].SetOrdinal(2);
8 голосов
/ 09 декабря 2008

Я использовал ваше предложение для создания метода расширения для DataColumnCollection DataSet:

public static void InsertAfter(this DataColumnCollection columns, 
                              DataColumn currentColumn, DataColumn newColumn)
{
    if (!columns.Contains(currentColumn.ColumnName))
       throw new ArgumentException(/** snip **/);

    columns.Add(newColumn);
    //add the new column after the current one
    columns[newColumn.ColumnName].SetOrdinal(currentColumn.Ordinal + 1); 
}

Теперь я могу написать:

 dt = ds.Tables[0];
 dt.Columns.InsertAfter(dt.Columns["column_2"], new DataColumn("column_3"));
0 голосов
/ 12 октября 2016

На основе https://stackoverflow.com/a/17372008/492336, Я использую SetOrdinal с IndexOf () для вставки bar перед foo:

table.Columns.Add("bar").SetOrdinal(table.Columns.IndexOf("foo"));

Чтобы вставить его после foo, просто добавьте +1:

table.Columns.Add("bar").SetOrdinal(table.Columns.IndexOf("foo")+1);
0 голосов
/ 09 декабря 2008

Скопируйте первые два столбца в новый набор данных, затем добавьте третий столбец и добавьте оставшиеся столбцы.

Вы можете обернуть это в функцию InsertAfter при необходимости.

...