2009-05-12 26 views
8

Tengo 10 registros de datos en una DataTable que tiene 3 campos "Foo", "Barra" y "Baz".¿Es posible cambiar filas y columnas en una vista de cuadrícula de datos?

Si conecto esto en un DataGridView veo 10 filas y 3 columnas, y los encabezados de columna muestran los nombres de los campos.

Me pregunto qué fácil es invertir las filas y columnas para que con los mismos datos termine con 3 filas y 10 columnas, con los nombres de los campos que se muestran en los encabezados de las filas.


Puedo hacer algunas cosas manualy, como anulando un método OnPaint y el dibujo los nombres de campo directamente en las celdas de encabezado de fila, pero yo estoy buscando algo más automatizado.

Nuevamente, hay una sugerencia de intercambiar valores manualmente, pero a menos que haga todos los valores Strings, esto no va a funcionar. 3 columnas en una tabla de datos: Foo, Bar y Baz de los tipos int, float y string simplemente no se transponen.

Incluso si gestioné todos estos cambios manuales, mis cuadrículas de datos tienen columnas CheckBox, columnas ComboBox - no existe tal contraparte de fila - no hay fila CheckBox o fila ComboBox. Donde actualmente solo necesito decirle al compilador "Agregar un ComboBoxColumn", tendría que volver a escribir para que cada celda se generara individualmente.

Idealmente me gustaría una TransposableDataGridView que expuso toda la funcionalidad de DataGridView, con una propiedad bool adicional "Transposed". De esa forma podría dejar todo mi código exactamente como está: no tendría que cambiar nada, excepto el tipo de cuadrícula.

Si no existe nada como esto, tal vez tenga que ir y escribirlo. (Solo debería llevarme un año más o menos :) :)

Respuesta

1

Puede hacer esto mediante la adición programática de la cantidad de columnas que necesita (por ejemplo, 7 más para crear 10) y luego cambiar fila, col con col, fila.

+0

¿Sugiere agregar columnas al DataTable o al DataGridView? –

5

Puede crear una nueva tabla de datos, agregar el número apropiado de columnas y luego copiar los valores de una tabla a la otra, simplemente cambie las filas y las columnas.

No creo que pueda establecer el encabezado de fila de la misma manera que puede establecer el encabezado de columna (o al menos no sé cómo), por lo que puede poner los nombres de campo en una columna separada.

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

Gracias por la respuesta, ¿qué sucede si tengo un bool DataColumn y una cadena DataColumn? ¿De qué tipo hago las columnas de la grilla transpuesta? –

+0

Si no establece el tipo, de forma predeterminada es cadena, por lo que si solo desea mostrar los datos al usuario que está bien para usted, porque los valores de otros tipos se convertirán automáticamente. La otra posibilidad es establecer el tipo a objeto. La variable de este tipo puede contener cualquier cosa. – svick

2

utilizo los Expres Desarrollador Vertical Grid .. Es como si quisiera una grilla rotada. También permite un editor diferente por fila.

Link to vertical grid product page

0

En mi caso necesario también añadir un nombre a todas las columnas de la nueva tabla. Escribí una función para generar una tabla transpuesta como esta:

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; 

} 
Cuestiones relacionadas