2008-12-09 2 views
20

Я пытаюсь вставить столбец в существующий DataSet, используя C#.Как вставить столбец в набор данных между двумя существующими столбцами?

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

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, что есть метод добавления

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

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

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

+0

Просто из любопытства, почему пытаются это сделать? Как правило, не очень хорошая идея, чтобы код базы данных зависел от столбцов заказа. – Ferruccio 2008-12-09 02:05:03

ответ

40

Для этой цели можно использовать метод 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); 
-1

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

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

8

Я использовал свое предложение, чтобы создать метод Удлинитель для 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")); 
0

основе 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); 
Смежные вопросы