2009-05-12 5 views
8

Ich habe 10 Datensätze von Daten in einer DataTable, die 3 Felder "Foo", "Bar" und "Baz" hat.Ist es möglich, Zeilen und Spalten in einer Datagridview zu wechseln?

Wenn ich verbinde dies in eine DataGridView sehe ich 10 Zeilen und 3 Spalten, und die Spaltenüberschriften zeigen die Namen der Felder.

Ich frage mich, wie einfach es ist, die Zeilen und Spalten umzukehren, so dass ich mit den gleichen Daten am Ende 3 Zeilen und 10 Spalten habe, wobei Feldnamen in den Zeilenköpfen angezeigt werden.


Ich kann einige Dinge tun manualy, wie ein OnPaint Methode überschrieben und die Feldnamen direkt in den Zeilenkopfzellen zeichnen, aber ich bin auf der Suche nach etwas mehr automatisiert.

Nochmals, es gibt einen Vorschlag, die Werte manuell zu vertauschen, aber wenn ich nicht alle Werte Strings mache, wird das nicht funktionieren. 3 Spalten in einer Datentabelle - Foo, Bar und Baz der Typen int, float und string werden einfach nicht transponiert.

Auch wenn ich alle diese manuellen Änderungen verwaltet habe, haben meine Datenraster CheckBox-Spalten, ComboBox-Spalten - kein solches Zeilengegenstück existiert - es gibt keine CheckBox-Zeile oder ComboBox-Zeile. Wo ich dem Compiler gerade sagen muss "Add a ComboBoxColumn" müsste ich neu schreiben, damit jede Zelle einzeln generiert wird.

Idealerweise hätte ich gerne eine TransposableDataGridView, die die gesamte Funktionalität der DataGridView mit einer zusätzlichen Bool-Eigenschaft "Transposed" verfügbar macht. Auf diese Weise könnte ich meinen gesamten Code genau so lassen, wie er ist - ich müsste nichts ändern, außer für die Art des Gitters.

Wenn so etwas nicht existiert, muss ich einfach gehen und es schreiben. (Sollte nur ein Jahr oder so dauern! :)

Antwort

1

Sie können dies tun, indem Sie die Anzahl der Spalten programmgesteuert hinzufügen (z. B. 7 mehr zu 10) und dann programmgesteuert Zeile, Spalte mit Spalte, Zeile tauschen.

+0

Schlägst du vor Spalten zur DataTable oder DataGridView hinzuzufügen? –

5

Sie können neue DataTable erstellen, die entsprechende Anzahl von Spalten hinzufügen und dann Werte von einer Tabelle in die andere kopieren, nur Zeilen und Spalten tauschen.

Ich glaube nicht, dass Sie Zeilenkopf auf die gleiche Weise wie Spaltenkopf festlegen können (oder zumindest weiß ich nicht wie), so können Sie die Feldnamen in separaten colum legen.

DataTable oldTable = new DataTable(); 

... 

DataTable newTable = new DataTable(); 

newTable.Columns.Add("Field Name"); 
for (int i = 0; i < oldTable.Rows.Count; i++) 
    newTable.Columns.Add(); 

for (int i = 0; i < oldTable.Columns.Count; i++) 
{ 
    DataRow newRow = newTable.NewRow(); 

    newRow[0] = oldTable.Columns[i].Caption; 
    for (int j = 0; j < oldTable.Rows.Count; j++) 
     newRow[j+1] = oldTable.Rows[j][i]; 
    newTable.Rows.Add(newRow); 
} 

dataGridView.DataSource = newTable; 
+0

Danke für die Antwort - was passiert, wenn ich eine bool DataColumn und eine Zeichenfolge DataColumn habe - welchen Typ mache ich die Spalten des transponierten Gitters? –

+0

Wenn Sie den Typ nicht festlegen, wird standardmäßig der Wert string verwendet. Wenn Sie also nur die Daten für den Benutzer anzeigen möchten, die für Sie in Ordnung sind, werden die Werte anderer Typen automatisch konvertiert. Die andere Möglichkeit besteht darin, den Typ auf ein Objekt zu setzen. Variable dieses Typs können alles enthalten. – svick

2

Ich verwende die Entwickler Expres Vertical Grid .. Es ist, als ob Sie ein gedrehtes Gitter wünschen. Es ermöglicht auch einen anderen Editor pro Zeile.

Link to vertical grid product page

0

In meinem Fall benötigt auch einen Namen für alle Spalten der neuen Tabelle hinzuzufügen. Ich habe eine Funktion geschrieben, um eine transponierte Tabelle wie folgt zu generieren:

static public DataTable Transpose(DataTable inputTable, List<string> newColumnNames) 
{ 
    DataTable outputTable = new DataTable(); 

    ///You should also verify if newColumnsNames.Count matches inputTable number of row 

    //Creates the columns, using the provided column names. 
    foreach (var newColumnName in newColumnNames) 
    { 
     outputTable.Columns.Add(newColumnName, typeof(string)); 
    } 

    foreach (DataColumn inputColumn in inputTable.Columns) 
    { 
     //For each old column we generate a row in the new table 
     DataRow newRow = outputTable.NewRow(); 

     //Looks in the former header row to fill in the first column 
     newRow[0] = inputColumn.ColumnName.ToString(); 

     int counter = 1; 
     foreach (DataRow row in inputTable.Rows) 
     { 
      newRow[counter] = row[inputColumn.ColumnName].ToString(); 
      counter++; 
     } 
     outputTable.Rows.Add(newRow); 
    } 

    return outputTable; 

} 
Verwandte Themen