1

WPF で ListView (DataGrid ではない) を、列が事前に不明な Matrix (Cross-Tab) DataSet にバインドすることは可能ですか?

例として Northwind データベースを使用します。以下の単純なクエリは、リストビューに簡単にバインドできる既知のデータセットを返します。

SELECT  Year(o.OrderDate) AS [Year], Month(o.OrderDate) AS [Month], 
COUNT(o.OrderID) AS [NumOrders]
FROM Orders o 
GROUP BY Year(o.OrderDate), Month(o.OrderDate)
ORDER BY 1, 2

代替テキスト

より意味のあるレポートを生成するには、上記のクエリの結果セットを (レポート プログラムで) 実行して、以下に示すようなものを生成します。

SELECT  [Year], 
SUM(CASE [Month] WHEN 1 Then NumOrders ELSE 0 END) AS 'Jan',
SUM(CASE [Month] WHEN 2 Then NumOrders ELSE 0 END) AS 'Feb',
SUM(CASE [Month] WHEN 3 Then NumOrders ELSE 0 END) AS 'Mar',
SUM(CASE [Month] WHEN 4 Then NumOrders ELSE 0 END) AS 'Apr',
SUM(CASE [Month] WHEN 5 Then NumOrders ELSE 0 END) AS 'May',
SUM(CASE [Month] WHEN 6 Then NumOrders ELSE 0 END) AS 'Jun',
SUM(CASE [Month] WHEN 7 Then NumOrders ELSE 0 END) AS 'Jul',
SUM(CASE [Month] WHEN 8 Then NumOrders ELSE 0 END) AS 'Aug',
SUM(CASE [Month] WHEN 9 Then NumOrders ELSE 0 END) AS 'Sep',
SUM(CASE [Month] WHEN 10 Then NumOrders ELSE 0 END) AS 'Oct',
SUM(CASE [Month] WHEN 11 Then NumOrders ELSE 0 END) AS 'Nov',
SUM(CASE [Month] WHEN 12 Then NumOrders ELSE 0 END) AS 'Dec'
FROM
( 
SELECT  Year(o.OrderDate) AS [Year], Month(o.OrderDate) AS [Month], 
COUNT(o.OrderID) AS [NumOrders]
FROM Orders o 
GROUP BY Year(o.OrderDate), Month(o.OrderDate)
)t0
GROUP BY [Year]

結果は次のようになります。

代替テキスト

私の質問は、結果の列を事前に知らなくても、この最終結果を WPF の ListView または Flowdocument にバインドすることは可能ですか?

4

2 に答える 2

2

ListView の GridViewColumns をプログラムで生成し、それにバインディングを適用できます。DataSet 内の列をループし、対応する GridViewColumn を ListView に追加します。

var gridView = (GridView)list.View;
foreach(var col in table.Columns) {
   gridView.Columns.Add(new GridViewColumn{
      Header=col.ColumnName, 
      DisplayMemberBinding=new Binding(col.ColumnName)});
}
于 2009-05-12T17:32:04.180 に答える
1

添付プロパティを使用して、ListView に列を動的に追加できます。CodeProjectのこの記事をチェックしてください。それはまさにそれを説明しています...

WPF DynamicListView - DataMatrix へのバインド

于 2009-05-15T06:07:02.677 に答える