web-dev-qa-db-fra.com

Comment insérer une colonne dans un jeu de données entre deux colonnes existantes?

J'essaie d'insérer une colonne dans un DataSet existant à l'aide de C #.

A titre d'exemple, j'ai un DataSet défini comme suit:

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

plus tard dans mon code, je souhaite insérer une colonne entre la colonne 2 et la colonne 4.

Les ensembles de données ont des méthodes pour ajouter une colonne, mais je n'arrive pas à trouver le meilleur moyen d'insérer une.

J'aimerais écrire quelque chose comme ce qui suit ...

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

Le résultat final doit être un ensemble de données comportant une table avec les colonnes suivantes: column_1 column_2 column_3 column_4

plutôt que: column_1 column_2 column_4 column_3 qui correspond à ce que me donne la méthode add

il doit sûrement y avoir un moyen de faire quelque chose comme ça.

Edit ... Je veux juste clarifier ce que je fais avec le DataSet en fonction des commentaires ci-dessous:

Je reçois un ensemble de données à partir d'une procédure stockée. Je dois ensuite ajouter des colonnes supplémentaires à l'ensemble de données, qui est ensuite converti en un document Excel. Je n'ai pas le contrôle sur les données renvoyées par le proc stocké, donc je dois ajouter des colonnes après coup.

20
mezoid

Vous pouvez utiliser la méthode DataColumn.SetOrdinal () à cette fin.

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);
40
lomaxx

J'ai utilisé votre suggestion pour créer une méthode d'extention pour le DataColumnCollection du 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); 
}

Je peux maintenant écrire:

 dt = ds.Tables[0];
 dt.Columns.InsertAfter(dt.Columns["column_2"], new DataColumn("column_3"));
8
mezoid

Sur la base de https://stackoverflow.com/a/17372008/492336 , j'utilise SetOrdinal avec IndexOf () pour insérer bar avant foo:

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

Pour l'insérer après foo, ajoutez simplement +1:

table.Columns.Add("bar").SetOrdinal(table.Columns.IndexOf("foo")+1);
0
sashoalm