2008-12-09 7 views
20

Ich versuche, eine Spalte in ein vorhandenes DataSet mit C# einzufügen.Wie fügt man eine Spalte in ein Dataset zwischen zwei vorhandenen Spalten ein?

Als Beispiel habe ich ein DataSet wie folgt definiert:

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

später in meinem Code Ich wünsche eine Spalte zwischen Spalte 2 und Spalte für 4.

Datasets haben Methoden zum Einfügen Hinzufügen eine Spalte, aber ich kann nicht scheinen, den besten Weg in der Einfügung zu finden.

Ich möchte so etwas wie die folgenden schreiben ...

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

Das Endergebnis sollte ein Datensatz sein, der eine Tabelle mit den folgenden Spalten: Spalte_1 column_2 column_3 column_4

anstatt: column_1 column_2 column_4 column_3 was ist das, was die add-Methode mir gibt

sicherlich muss es eine Möglichkeit geben, so etwas zu tun. wollen

bearbeiten ... Nur um zu klären, was ich mit dem DataSet mache unten einige der Kommentare, basierend auf:

ich einen Datensatz aus einer gespeicherten Prozedur immer bin. Ich muss dann zusätzliche Spalten zu dem Datensatz hinzufügen, der dann in ein Excel-Dokument konvertiert wird. Ich habe keine Kontrolle über die Daten von der gespeicherten proc zurückgegeben, so dass ich Spalten nach der Tatsache hinzufügen müssen.

+0

Nur aus Neugier, warum dies zu tun versuchen? Es ist normalerweise keine gute Idee, wenn der Datenbankcode davon abhängt, in welcher Reihenfolge die Spalten gespeichert sind. – Ferruccio

+0

Ich bekomme einen Datensatz von einer gespeicherten Prozedur. Ich muss dann dem Datensatz zusätzliche Spalten hinzufügen, die dann in ein Excel-Dokument konvertiert werden. Ich habe keine Kontrolle über die Daten, die vom gespeicherten Proc zurückgegeben werden, daher muss ich nachträglich Spalten hinzufügen. – mezoid

+1

Ich war dort. Manchmal muss man nur einen Hack schreiben. Normalerweise, weil dein Chef es verlangt. –

Antwort

40

Sie können hierfür die Methode DataColumn.SetOrdinal() verwenden.

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

Kopieren Sie die ersten beiden Spalten in ein neues Dataset, fügen Sie dann die dritte Spalte hinzu und fügen Sie die übrigen Spalten hinzu.

Sie könnten das bei Bedarf in eine InsertAfter-Funktion einbinden.

8

habe ich Ihren Vorschlag eine Erweiterung Methode für den Datensatz des Datacolumncollection zu erstellen:

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

Ich kann jetzt schreiben:

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

Basierend auf https://stackoverflow.com/a/17372008/492336, verwende ich SetOrdinal mit IndexOf () bar vor foo einfügen:

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

Um es nach foo legen Sie einfach +1 hinzufügen:

table.Columns.Add("bar").SetOrdinal(table.Columns.IndexOf("foo")+1); 
Verwandte Themen