2009-09-24 100 views
6

我一个C#/ WPF:工具包的DataGrid - 转置行和列

List<DetailObject> someList; 

,看起来像这样:

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

有谁知道我该如何使用(与DataGrid.AutoGenerateColumns = “True”)作为RowHeader和其他成员的“字符串标题”的值作为“行”内容?没有任何修改,它会告诉我“Titel”作为ColumnHeader和Titel作为行的值,dito为 “Value1”为ColumnHeader,Value1的值为行等。

感谢您的任何帮助!

干杯

编辑: 为了更好的理解,这是我

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

,这就是我在寻找:

[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: 我发现这里也是一个不错的方法: http://codemaverick.blogspot.com/2008/02/transpose-datagrid-or-gridview-by.html

回答

3

您可以使用RowHeaderTemplate这样的:

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

您还必须设置AutoGenerateColumnsfalse并创建自己的列,以避免Titel财产也被显示为一列。

编辑

我现在明白了,你要转的DataGrid。我认为简单但有点“黑客”的解决方案是创建一个“转置”对象列表。为此,您必须事先知道原始列表中有多少个对象,然后创建一个具有与对象一样多的属性的新类。

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

甲少“哈克”的解决方案是修改DataGrid的控制模板交换行和列。但是,DataGrid是一个复杂的控件,修改控件模板可能有点压倒性。

+0

感谢您的回复。我尝试了这一点,但它只会显示Item.Titel作为行。我想要的是将每个Item.Titel(来自List someList)作为一个列以及它在Row/Cell中的所有信息(例如Item.Value1)。我将创建一个我在问题中意思的“模型”:) – 2009-09-24 13:54:07

+0

关于编辑:Chaning DataSource是一个选项,我将不得不考虑如何创建一个可处理动态“Columns “,因为原始列表是可变的。感谢您的帮助和意见。如果我找到解决方案,我会在这里发布。我会把问题留到明天,也许别人有一个想法 - 如果没有,我会标记你的答案是正确的。 – 2009-09-24 16:35:29

+0

您可以创建一个具有很多属性的类,然后以编程方式修改“DataGrid”以仅显示与原始对象一样多的列。在.NET 4中,您还可以选择在运行时创建动态类。 – 2009-09-24 16:44:19

3

将业务对象列表转换为数据表,您可以在其中创建对象属性中的列,并将其设置为数据网格的项目源。如果要启用编辑,则必须迭代数据表并手动将值应用回业务对象。反射可能有助于使网格具有通用性。只是一些想法。

5

这个线程是有点老,但也许有人仍感兴趣......我也一直在寻找方法来转一WPF的DataGrid终于让我发现了CodePlex上,基于以下开源项目:

Transposed WPF DataGrid

希望这有助于。

1

我认为更清洁的方法是使用ItemsControl而不是DataGrid您的方案。

按照this blog post的说明操作,并创建您自己的ItemTemplate以获得最大限度的控制。这样,您可以为每个列(可以是Datagrid本身)创建一个模板。