Как вставить столбец в набор данных между двумя существующими столбцами?
Я пытаюсь вставить столбец в существующий 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 документ. Я не контролирую данные, возвращаемые хранимой процедурой поэтому я должен добавить столбцы после факт.
Ответы
Ответ 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, если это необходимо.