2009-09-24 101 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本身)創建一個模板。