2009-05-12 6 views
8

Ho 10 record di dati in un DataTable che ha 3 campi "Foo", "Bar" e "Baz".È possibile cambiare righe e colonne in un datagridview?

Se collego questo cavo a un DataGridView vedo 10 righe e 3 colonne e le intestazioni delle colonne mostrano i nomi dei campi.

Mi chiedo quanto sia facile invertire le righe e le colonne in modo che con gli stessi dati finisco con 3 righe e 10 colonne, con i nomi dei campi visualizzati nelle intestazioni delle righe.


posso fare alcune cose manualy, come l'override un metodo OnPaint e disegnare i nomi dei campi direttamente nelle celle di intestazione di riga, ma sto cercando qualcosa di più automatizzato.

Ancora, c'è un suggerimento di scambiare valori manualmente, ma a meno che non crei tutti i valori di Stringhe, questo non funzionerà. 3 colonne in una tabella di dati - Foo, Bar e Baz di tipi int, float e string semplicemente non traspongono.

Anche se ho gestito tutte queste modifiche manuali, le mie griglie di dati hanno colonne CheckBox, colonne ComboBox - nessuna controparte di tali righe esiste - non esiste una riga CheckBox o una riga di ComboBox. Dove attualmente devo solo dire al compilatore di "Aggiungi un ComboBoxColumn" dovrei riscrivere in modo che ogni cella sia stata generata singolarmente.

Idealmente mi piacerebbe un TransposableDataGridView che ha esposto tutte le funzionalità di DataGridView, con una proprietà bool aggiuntiva "Trasposta". In questo modo potrei lasciare tutto il mio codice esattamente com'è - non dovrei cambiare nulla tranne il tipo di griglia.

Se non esiste nulla di simile, potrei semplicemente andare a scriverlo. (Dovrebbe prendermi solo un anno circa :) :)

risposta

1

È possibile farlo aggiungendo il numero di colonne necessario (ad esempio, 7 in più per fare 10) quindi scambiando a livello di codice riga, colonna con colonna, riga.

+0

Stai suggerendo di aggiungere colonne al DataTable o al DataGridView? –

5

È possibile creare nuovo DataTable, aggiungere il numero appropriato di colonne e quindi copiare i valori da una tabella all'altra, basta scambiare righe e colonne.

Non penso che sia possibile impostare l'intestazione di riga nello stesso modo in cui è possibile impostare l'intestazione di colonna (o almeno non so come), in modo da poter inserire i nomi dei campi in una colonna separata.

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

Grazie per la risposta - cosa succede se ho un bool DataColumn e una stringa DataColumn - che tipo faccio le colonne della griglia trasposta? –

+0

Se non si imposta il tipo, il valore predefinito è la stringa, quindi se si desidera mostrare i dati all'utente, ciò va bene per voi, poiché i valori degli altri tipi verranno convertiti automaticamente. L'altra possibilità è quella di impostare il tipo su oggetto. Variabile di questo tipo può contenere qualsiasi cosa. – svick

2

Io uso le Expres sviluppatori Vertical Grid .. È come se si desidera una griglia ruotata. Permette anche un editor diverso per riga.

Link to vertical grid product page

0

Nel mio caso necessario anche per aggiungere un nome a tutte le colonne della nuova tabella. Ho scritto una funzione per generare una tabella trasposta come questa:

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; 

}