2011-06-24 154 views
7

我有一個填充了DataSet數據的WPF DataGrid。我有CanUserSortColumns設置爲true在WPF DataGrid中保留用戶定義的排序順序

是否可以保留用戶在網格刷新時指定的排序?我把它留住這是使用

object selectedItem = dgInvoiceHeads.SelectedItem; 

刷新發生之前,然後放置

dgInvoiceHeads.SelectedItem = selectedItem; 

刷新發生後選擇的項目。

但我似乎無法得到它保留指定的排序。

回答

3

我的一位同事提出了這個問題。它似乎工作正常。唯一的事情是我認爲DataGrid中的列標題需要與數據庫中的列標題相同。

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

通過在列實例中使用SortMemberPath而不是Header屬性,可以解決必須使頭文件與類成員相同的問題。 'sortHeader = e.Column.SortMemberPath' – BrianVPS

3

以下代碼是從此forum post中提取的,它顯示瞭如何獲取排序說明和列信息並將其恢復。

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

您是否嘗試過獲取數據集的collectionview?

CollectionViewSource.GetDefaultView(yourDataSet).SortDescriptions 

這會給你一個當前sortdescriptions的數組。然後您可以堅持這些,並在下一次適用他們如下

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

希望它有幫助。

+2

沒錯!這應該是正確的解決方案..並且是唯一的解決方案。如果我是正確的,你甚至不必「記住」以前的排序或分組:一旦它們被聲明爲int的collectionViewSource,所有新增加的項目將被相應地排序,就好像你只是做了一個粗暴的動作'。刷新()'在'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