2011-09-07 658 views
8

Tengo una grilla con varias columnas y los usuarios pueden ordenar en función de cualquier columna. Los datos, que están vinculados a la cuadrícula, son una colección de entidades personalizadas. Tengo un botón de impresión en la pantalla y al hacer clic en este botón necesito hacer una impresión personalizada. La impresión debe mostrar los datos en el mismo orden que se muestra en la cuadrícula (con datos adicionales)Cómo obtener elementos ordenados desde una cuadrícula de datos

¿Hay alguna manera de obtener directamente el origen de datos ordenado en lugar de ordenar el origen de datos en el evento de clasificación?

Gracias Pankaj

Respuesta

5

Sí, la hay. En WPF, siempre se vincula un CollectionView, nunca la colección en sí. Si no especifica una vista de colección usted mismo, se usa una predeterminada. Puede acceder a esta vista colección predeterminada de esta manera:

CollectionViewSource.GetDefaultView(yourCollectionOfCustomEntities); 

Esta es la vista de colección, como se muestra por la red con toda la clasificación y filtrado aplicado.

+1

Sobre la base de su respuesta lo que he entendido es que la colección de origen no cambiará nunca y sólo el CollectionView conseguirá cambiado (como y cuando clasifica los datos de usuario en cualquier columna). Para que mi impresión funcione, necesito datos en el formulario de recolección (Lista (de Entidades)). Por lo tanto, la vista de colección predeterminada no será suficiente. ¿Hay una manera fácil de obtener la colección también ordenada en función de collectionView ordenado? Una cosa que observé durante la depuración es que CollectionView tiene una propiedad protegida InternalList, que tiene la colección ordenada. Pero como la propiedad está protegida, no puedo obtenerla. –

+0

Cuando enumera sobre la vista de colección, los artículos deben devolverse en el orden ordenado ... por favor marque –

+0

Sí, puedo enumerar la vista de colección y construir la colección ordenada. –

2

También puede enumerar la propiedad Items de su DataGrid. A diferencia de la propiedad ItemsSource, la propiedad Items parece reflejar exactamente lo que está en la pantalla, incluida la clasificación y el filtrado. Por ejemplo:

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

Tienes que usar las yourDataGrid.Items, productos que reflejan la CurrentView de la parrilla. y debe convertir utilizando el método Cast y después del uso .ToList();

imaginar esto

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

Creo que esta es una mejor respuesta que la aceptada. –

Cuestiones relacionadas