In WPF, si può associare un controllo ListView (non DataGrid) ad un (Cross-Tab) DataSet Matrix?
Domanda
E 'possibile in WPF associare un ListView (non un DataGrid) a una matrice (Cross-Tab) DataSet in cui le colonne sono sconosciuti in precedenza?
Utilizzando il database Northwind come esempio: il semplice query di seguito restituirà un set di dati noto che può essere facilmente associato a una listview:
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
Per generare un rapporto più significativo, potremmo correre il set di risultati della query precedente (in un programma di segnalazione) per generare qualche cosa come di seguito illustrato di seguito:
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]
che si traduce in qualcosa di simile a questo:
La mia domanda è, è possibile associare questo risultato finale per un controllo ListView o un FlowDocument in WPF senza avere una conoscenza preventiva delle colonne risultanti?
Soluzione
È possibile aggiungere colonne dinamicamente a un controllo ListView utilizzando proprietà associate. Dai un'occhiata a questo articolo sul CodeProject spiega esattamente che ...
Altri suggerimenti
È possibile generare i GridViewColumns per la ListView programatically e applicare il legame a questo. Loop attraverso le colonne del DataSet e aggiungere una corrispondente GridViewColumn nella 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)});
}