Подтвердить что ты не робот

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

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

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

Конечным результатом должен быть набор данных, который имеет таблицу со следующими столбцами: column_1 column_2 column_3 column_4

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

Конечно, должен быть способ сделать что-то вроде этого.

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

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

4b9b3361

Ответ 1

Вы можете использовать метод 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);

Ответ 2

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

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"));

Ответ 3

Основываясь на fooobar.com/questions/71998/..., я использую 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);

Ответ 4

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

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