2011-09-07 8 views
8

Ho una griglia con più colonne e gli utenti possono ordinare in base a qualsiasi colonna. I dati, che sono associati alla griglia, sono una raccolta di entità personalizzate. Ho un pulsante di stampa sullo schermo e al clic di questo pulsante ho bisogno di fare una stampa personalizzata. La stampa deve mostrare i dati nello stesso ordine visualizzato nella griglia (con dati aggiuntivi)Come ottenere l'origine di elementi ordinati da un datagrid

C'è un modo per ottenere direttamente l'origine dati ordinata invece di ordinare l'origine dati nell'evento di ordinamento?

Grazie Pankaj

risposta

5

Sì, c'è. In WPF, viene sempre associato un CollectionView, mai la raccolta stessa. Se non si specifica una vista raccolta da soli, viene utilizzata quella predefinita. È possibile accedere a questa visualizzazione raccolta predefinita simili:

CollectionViewSource.GetDefaultView(yourCollectionOfCustomEntities); 

Questa è la vista raccolta come mostrato dalla griglia con tutta l'ordinamento e filtro applicato.

+1

Sulla base della sua risposta quello che ho capito è che la raccolta fonte non cambierà mai e solo il CollectionView avranno cambiato (come e quando Ordinamenti dati utente in qualsiasi colonna). Perché la mia stampa funzioni, ho bisogno di dati nel modulo di raccolta (Elenco (di entità)). Quindi la vista raccolta predefinita non è sufficiente. C'è un modo semplice per ottenere la raccolta anche ordinata in base alla raccolta ordinata? Una cosa che ho osservato durante il debug è che CollectionView ha una proprietà protetta InternalList, che sta avendo la raccolta ordinata. Ma dal momento che la proprietà è protetta non riesco a ottenerlo. –

+0

Quando si annulla la vista di raccolta, gli articoli devono essere restituiti nell'ordine ordinato ... per favore controllare –

+0

Sì, sono in grado di enumerare la vista di raccolta e creare la raccolta ordinata. –

2

È anche possibile enumerare semplicemente la proprietà Items di DataGrid. A differenza della proprietà ItemsSource, la proprietà Items sembra riflettere esattamente cosa c'è sullo schermo incluso l'ordinamento e il filtraggio. Per esempio:

foreach (var item in dataGrid.Items) 
{ 
    // do something 
} 
7

Devi usare i yourDataGrid.Items, Elementi riflettono la CurrentView della griglia. e devi convertire usando il metodo Cast e dopo l'uso .ToList();

immaginare questo

List<MyClass> myListOfMyClass = new List<MyClass>(); 
myGrid.ItemSource = myListOfMyClass; 
List<MyClass> myListOfMyClassSortedByTheUser = myGrid.Items.Cast<MyClass>().ToList(); 
+3

Penso che questa sia una risposta migliore di quella accettata. –

Problemi correlati