2009-09-24 18 views
6

Ho unC#/WPF: Toolkit DataGrid - recepire righe e colonne

List<DetailObject> someList; 

che assomiglia a questo:

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

qualcuno sa come posso usare (con DataGrid.AutoGenerateColumns = "True") il valore di "stringa Titel" come RowHeader e altri membri come contenuto "Riga"? Senza alcuna modifica, che verrà visualizzato me "Titel" come ColumnHeader e il valore di Titel come fila, dito per "Value1", come ColumnHeader e il valore (s) di Valore1 come righe ecc

Grazie per qualsiasi aiuto !

Acclamazioni

EDIT: Per una migliore comprensione, questo è quello che ho

[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] 

e questo è quello che sto cercando:

[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: ho trovato anche un buon approccio qui: http://codemaverick.blogspot.com/2008/02/transpose-datagrid-or-gridview-by.html

risposta

3

È possibile utilizzare RowHeaderTemplate come questo:

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

Avrete anche impostare AutoGenerateColumns-false e creare le proprie colonne per evitare la proprietà Titel anche essere visualizzato come una colonna.

Modifica

ho capito che si desidera trasporre la DataGrid. Penso che la soluzione facile ma alquanto "hacky" sia quella di creare una lista di oggetti "trasposti". Per fare questo dovresti sapere in anticipo quanti oggetti ci sono nella lista originale e quindi creare una nuova classe con tante proprietà quanti sono gli oggetti.

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 soluzione meno "hacky" è quello di modificare il modello di controllo del DataGrid per scambiare righe e colonne. Tuttavia, DataGrid è un controllo complesso e può essere un po 'opprimente modificare il modello di controllo.

+0

Grazie per la risposta. Ho provato questo, ma mostrerà solo il Item.Titel come riga. Quello che voglio è avere ogni Item.Titel (dalla List some List) come una Column e tutte le informazioni (ad esempio Item.Value1) sotto in una Row/Cell. Creerò un "mockup" di ciò che intendo nella domanda :) –

+0

Per quanto riguarda la modifica: la modifica del DataSource è un'opzione, dovrò pensare a come creare una classe che possa gestire un insieme dinamico di "Colonne" ", poiché l'elenco originale è variabile. Grazie per il tuo aiuto e input. Se trovo una soluzione, la posterò qui. Lascerò la domanda aperta fino a domani, forse qualcun altro ha un'idea - se no, segnerò la tua risposta come corretta. –

+0

È possibile creare una classe con molte proprietà e quindi modificare in modo programmatico il 'DataGrid' per mostrare solo il numero di colonne degli oggetti originali. In .NET 4 hai anche la possibilità di creare una classe dinamica in fase di esecuzione. –

3

Convertire l'elenco di oggetti business in un datatable in cui sono state create le colonne dalle proprietà dell'oggetto e impostate come origine articoli del datagrid. Se si desidera abilitare la modifica, sarà necessario iterare il datatable e applicare manualmente i valori ai propri oggetti business. la riflessione può aiutare a rendere la griglia generica. solo alcuni pensieri

5

Questo thread è un po 'vecchio, ma forse qualcuno è ancora interessato ... Sono stato anche alla ricerca di modo per trasporre una WPF DataGrid e finalmente ho trovato il seguente progetto open source su CodePlex:

Transposed WPF DataGrid

Spero che questo aiuti.

1

Penso che un approccio più pulito sia quello di utilizzare ItemsControl anziché lo DataGrid per il proprio scenario.

Seguire le indicazioni su this blog post e creare il proprio ItemTemplate per il massimo controllo. In questo modo, puoi creare un modello per ogni colonna (che può essere un Datagrid stesso).

Problemi correlati