2009-09-24 9 views
6

Je suis unC#/WPF: DataGrid Toolkit - Transposer lignes et colonnes

List<DetailObject> someList; 

qui ressemble à ceci:

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

Est-ce que quelqu'un sait comment je peux utiliser (avec DataGrid.AutoGenerateColumns = "True") la valeur de "chaîne Titel" en tant que RowHeader et d'autres membres en tant que "Row" contenu? Sans aucune modification, il me montrera "Titel" comme ColumnHeader et la valeur de Titel comme ligne, dito pour "Value1" comme ColumnHeader et la valeur de Value1 comme Rows etc.

Merci pour toute aide !

Vive

EDIT: Pour une meilleure compréhension, c'est ce que j'ai

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

et voici ce que je cherche:

[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: J'ai trouvé aussi une bonne approche ici: http://codemaverick.blogspot.com/2008/02/transpose-datagrid-or-gridview-by.html

Répondre

3

Vous pouvez utiliser RowHeaderTemplate comme ceci:

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

Vous aurez également définir AutoGenerateColumns-false et créer vos propres colonnes pour éviter la propriété Titel également affiché comme une colonne.

Modifier

Je comprends maintenant que vous voulez transposer la DataGrid. Je pense que la solution facile mais quelque peu "hacky" est de créer une liste d'objets "transposés". Pour ce faire, vous devez savoir à l'avance combien d'objets il y a dans la liste originale et ensuite créer une nouvelle classe avec autant de propriétés que d'objets.

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 
    }, 
    ... 
}; 

A moins de solution « hacky » est de modifier le modèle de commande de la DataGrid pour échanger les lignes et les colonnes. Cependant, DataGrid est un contrôle complexe et il peut être un peu écrasant de modifier le modèle de contrôle.

+0

Merci pour la réponse. J'ai essayé ceci, mais cela montrera seulement le Item.Titel en tant que Row. Ce que je veux, c'est avoir chaque Item.Titel (de la List someList) sous la forme d'une Colonne et toutes ses infos (par exemple Item.Value1) ci-dessous dans une Ligne/Cellule. Je vais créer une "maquette" de ce que je veux dire dans la question :) –

+0

En ce qui concerne l'édition: Chaning the DataSource est une option, je vais devoir réfléchir à la façon de créer une classe qui peut gérer un ensemble dynamique de "Colonnes ", puisque la liste originale est variable. Merci pour votre aide et votre contribution. Si je trouve une solution, je l'afficherai ici. Je vais laisser la question ouverte jusqu'à demain, peut-être que quelqu'un d'autre a une idée - sinon, je marquerai votre réponse comme correcte. –

+0

Vous pouvez créer une classe avec beaucoup de propriétés, puis modifier par programme 'DataGrid' pour afficher uniquement autant de colonnes que d'objets d'origine. Dans .NET 4, vous avez également la possibilité de créer une classe dynamique lors de l'exécution. –

3

Convertissez la liste d'objets métier en une datatable dans laquelle vous avez créé les colonnes à partir des propriétés de votre objet et définissez-la comme source d'éléments de votre DataGrid. Si vous souhaitez activer la modification, vous devez répéter la date et appliquer manuellement les valeurs à vos objets métier. la réflexion peut aider à rendre la grille générique. juste quelques pensées.

5

Ce fil est un peu vieux, mais peut-être quelqu'un est toujours intéressé ... Je cherchais aussi pour la manière de transposer un DataGrid WPF et enfin j'ai trouvé le projet open source suivante sur CodePlex:

Transposed WPF DataGrid

Espérons que cela aide.

1

Je pense que l'approche plus propre consiste à utiliser ItemsControl au lieu de DataGrid pour votre scénario.

Suivez les instructions sur this blog post et créez votre propre ItemTemplate pour un contrôle maximal. De cette façon, vous pouvez créer un modèle pour chaque colonne (qui peut être elle-même une Datagrid).

Questions connexes