2009-09-24 15 views
6

He unaC#/WPF: DataGrid Toolkit - transponer filas y columnas

List<DetailObject> someList; 

que se parece a esto:

public class DetailObject 
    { 
     public string Titel { get; set; } 
     public int Value1 { get; set; } 
     public int Value2 { get; set; } 
     public int Value3 { get; set; } 
    } 

¿Alguien sabe cómo puedo usar (con DataGrid.AutoGenerateColumns = "True") el valor de 'string Titel' como RowHeader y otros miembros como contenido "Row"? Sin ninguna modificación, me mostrará "Titel" como ColumnHeader y el valor de Titel como fila, dito para "Value1" como ColumnHeader y el valor (es) de Value1 como filas, etc.

Gracias por cualquier ayuda !

Saludos

EDIT: Para una mejor comprensión, esto es lo que tengo

[Titel]  [Value1]  [Value2]  [Value3] 
[Item1.Titel] [Item1.Value1] [Item1.Value2] [Item1.Value3] 
[Item2.Titel] [Item2.Value1] [Item2.Value2] [Item2.Value3] 
[Item3.Titel] [Item3.Value1] [Item3.Value2] [Item3.Value3] 

y esto es lo que estoy buscando:

[Item1.Titel] [Item2.Titel] [Item3.Titel] 
[Item1.Value1] [Item2.Value1] [Item3.Value1] 
[Item1.Value2] [Item2.Value2] [Item3.Value2] 
[Item1.Value3] [Item2.Value3] [Item3.Value3] 

Edit2: He encontrado también un buen enfoque aquí: http://codemaverick.blogspot.com/2008/02/transpose-datagrid-or-gridview-by.html

Respuesta

3

Puede utilizar RowHeaderTemplate así:

<toolkit:DataGrid> 
    <toolkit:DataGrid.RowHeaderTemplate> 
    <DataTemplate> 
     <TextBlock Text="{Binding Item.Titel, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type toolkit:DataGridRow}}}"/> 
    </DataTemplate> 
    </toolkit:DataGrid.RowHeaderTemplate> 
</toolkit:DataGrid> 

También tendrá que establecer AutoGenerateColumns a false y crear sus propias columnas para evitar la propiedad Titel también se muestra como una columna.

Editar

ahora entiendo que desea transponer la DataGrid. Creo que la solución fácil pero algo "hacky" es crear una lista de objetos "transpuestos". Para hacer esto, debería saber de antemano cuántos objetos hay en la lista original y luego crear una nueva clase con tantas propiedades como objetos.

class TransposedDetailObject { 
    public String Column1 { get; set; } 
    public String Column2 { get; set; } 
    public String Column3 { get; set; } 
} 

var transposedList new List<TransposedDetailObject> { 
    new TransposedDetailObject { 
    Column1 = someList[0].Titel, 
    Column2 = someList[2].Titel, 
    Column3 = someList[3].Titel 
    }, 
    new TransposedDetailObject { 
    Column1 = someList[0].Value1, 
    Column2 = someList[2].Value1, 
    Column3 = someList[3].Value1 
    }, 
    ... 
}; 

Una solución menos "hacky" es modificar la plantilla de control de la DataGrid para intercambiar filas y columnas. Sin embargo, DataGrid es un control complejo y puede ser abrumador modificar la plantilla de control.

+0

Gracias por la respuesta. Probé esto, pero solo mostrará el Item.Titel como Row. Lo que quiero es tener cada Item.Titel (de la Lista someList) como una Columna y todas sus informaciones (por ejemplo, Item.Value1) a continuación en una Fila/Célula. Crearé una "maqueta" de lo que quiero decir en la pregunta :) –

+0

En cuanto a la edición: Cambiar el DataSource es una opción, tendré que pensar en cómo crear una clase que pueda manejar un conjunto dinámico de "Columnas" ", ya que la lista original es variable. Gracias por su ayuda y aporte. Si encuentro una solución, la publicaré aquí. Dejaré la pregunta abierta hasta mañana, tal vez alguien más tenga una idea; de lo contrario, marcaré su respuesta como correcta. –

+0

Puede crear una clase con muchas propiedades y modificar programáticamente 'DataGrid' para que solo muestre tantas columnas como objetos originales. En .NET 4 también tiene la opción de crear una clase dinámica en tiempo de ejecución. –

3

Convierta la lista de objetos comerciales en una tabla de datos donde haya creado las columnas a partir de las propiedades de su objeto y configúrelo como la fuente de elementos de su cuadrícula de datos. Si desea habilitar la edición, deberá iterar la tabla de datos y aplicar manualmente los valores a sus objetos comerciales. la reflexión puede ayudar a que la cuadrícula sea genérica. solo algunos pensamientos

5

Este hilo es un poco viejo, pero tal vez alguien todavía está interesada ... Yo también estaba buscando una manera de incorporar WPF DataGrid y finalmente encontré el siguiente proyecto de código abierto en CodePlex:

Transposed WPF DataGrid

Espero que esto ayude.

1

Creo que un enfoque más limpio es usar ItemsControl en lugar de DataGrid para su escenario.

Siga las instrucciones en this blog post y cree su propio ItemTemplate para un control máximo. De esta manera, puede crear una plantilla para cada columna (que puede ser una Datagrid).

Cuestiones relacionadas