Как вставить столбец в набор данных между двумя существующими столбцами?

Я пытаюсь вставить столбец в существующий набор данных с помощью С#.

В качестве примера у меня есть 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.

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

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

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

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

а не: column_1 column_2 column_4 column_3, что дает мне метод добавления

наверняка должен быть способ сделать что-то подобное.

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

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


person mezoid    schedule 09.12.2008    source источник
comment
Просто из любопытства, почему пытаются это сделать? Обычно не рекомендуется, чтобы код базы данных зависел от порядка хранения столбцов.   -  person Ferruccio    schedule 09.12.2008
comment
Я получаю набор данных из хранимой процедуры. Затем мне нужно добавить дополнительные столбцы в набор данных, который затем преобразуется в документ Excel. У меня нет контроля над данными, возвращаемыми хранимой процедурой, поэтому мне приходится добавлять столбцы постфактум.   -  person mezoid    schedule 09.12.2008
comment
Я был здесь. Иногда вам просто нужно написать хак. Обычно потому, что этого требует ваш босс.   -  person Paul Morel    schedule 09.12.2008


Ответы (4)


Вы можете использовать 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);
person lomaxx    schedule 09.12.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"));
person mezoid    schedule 09.12.2008

На основе 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);
person sashoalm    schedule 12.10.2016

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

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

person Paul Morel    schedule 09.12.2008