2011-06-24 6 views
7

Tengo un WPF DataGrid que se rellena con datos de DataSet. Tengo CanUserSortColumns establecido en verdadero.Conservar el orden de clasificación definido por el usuario en WPF DataGrid

¿Es posible conservar la clasificación que el usuario especificó cuando se actualizó la red? Tengo que conserva el elemento seleccionado utilizando

object selectedItem = dgInvoiceHeads.SelectedItem; 

antes de que la actualización se lleva a cabo y luego colocar

dgInvoiceHeads.SelectedItem = selectedItem; 

después de la actualización se lleva a cabo.

Pero parece que no puedo conseguir que retenga el tipo especificado.

Respuesta

3

A uno de mis colegas se le ocurrió esto. Parece estar funcionando correctamente. Lo único es que creo que los encabezados de columna deben ser iguales en DataGrid que en DB.

string sortHeader; 
string prevSortHeader; 
SortDescription sd; 

private void dgInvoiceHeads_Sorting(object sender, DataGridSortingEventArgs e) { 
    sortHeader = e.Column.Header.ToString(); 

    if (sortHeader == prevSortHeader) { 
    sd = new SortDescription(sortHeader, ListSortDirection.Descending); 
    } 
    else { 
    sd = new SortDescription(sortHeader, ListSortDirection.Ascending); 
    } 
    prevSortHeader = sortHeader; 
} 

HTH

+2

Puede solucionar el problema de tener que tener sus encabezados igual que los miembros de su clase utilizando SortMemberPath en la instancia de columna en lugar de la propiedad de encabezado. 'sortHeader = e.Column.SortMemberPath' – BrianVPS

3

El siguiente código fue extraído de este forum post y muestra cómo obtener las descripciones de clasificación y la información de la columna y restaurarla.

List<DataGridColumn> GetColumnInfo(DataGrid dg) { 
    List<DataGridColumn> columnInfos = new List<DataGridColumn>(); 
    foreach (var column in dg.Columns) { 
     columnInfos.Add(column); 
    } 
    return columnInfos; 
} 

List<SortDescription> GetSortInfo(DataGrid dg) { 
    List<SortDescription> sortInfos = new List<SortDescription>(); 
    foreach (var sortDescription in dg.Items.SortDescriptions) { 
     sortInfos.Add(sortDescription); 
    } 
    return sortInfos; 
} 

void SetColumnInfo(DataGrid dg, List<DataGridColumn> columnInfos) { 
    columnInfos.Sort((c1, c2) => { return c1.DisplayIndex - c2.DisplayIndex; }); 
    foreach (var columnInfo in columnInfos) { 
     var column = dg.Columns.FirstOrDefault(col => col.Header == columnInfo.Header); 
     if (column != null) { 
      column.SortDirection = columnInfo.SortDirection; 
      column.DisplayIndex = columnInfo.DisplayIndex; 
      column.Visibility = columnInfo.Visibility; 
     } 
    } 
} 

void SetSortInfo(DataGrid dg, List<SortDescription> sortInfos) { 
    dg.Items.SortDescriptions.Clear(); 
    foreach (var sortInfo in sortInfos) { 
     dg.Items.SortDescriptions.Add(sortInfo); 
    } 
} 
3

¿Ha intentado con la colección vista para el conjunto de datos?

CollectionViewSource.GetDefaultView(yourDataSet).SortDescriptions 

Esto le dará una selección de las clasificaciones actuales. A continuación, puede persistir en estos, y la próxima vez aplicarlos de la siguiente manera

CollectionViewSource.GetDefaultView(yourDataSet).SortDescriptions.Add(...) 

Espero que ayude.

+2

Sí! esta debería ser la solución correcta ... y la única. Y si estoy en lo cierto, ni siquiera tiene que "recordar" la ordenación o agrupamiento anterior: una vez que se declaran en su colecciónViewSource, todos los nuevos elementos añadidos se ordenarán en consecuencia, como si acabara de hacer una brut force '.() 'en el objeto' ICollectionView '... – Bruno

1
private void testGrid_Sorting(object sender, DataGridSortingEventArgs e) 
     { 

ListSortDirection direction = (e.Column.SortDirection != ListSortDirection.Ascending) ? 
           ListSortDirection.Ascending : ListSortDirection.Descending; 

// You will get the current direction in direction 

     } 

This is another solution 
Cuestiones relacionadas