2011-06-24 16 views
7

DataSetのデータが格納されたWPF DataGridがあります。私はCanUserSortColumnsに設定しました。です。WPF DataGridでユーザー定義の並べ替え順序を保持します。

グリッドをリフレッシュするときにユーザーが指定した並べ替えを保持できますか?私はそれがリフレッシュが行われ、リフレッシュが行われた後、その後

dgInvoiceHeads.SelectedItem = selectedItem; 

を配置する前に

object selectedItem = dgInvoiceHeads.SelectedItem; 

を使用して、選択した項目を保持できます。

しかし、私は指定された並べ替えを保持するように見えることはできません。

答えて

3

私の同僚の一人がこれを思いついた。それは正しく動作しているようです。唯一のことは、DB内にあるように、列ヘッダーが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を使用して、クラスメンバと同じヘッダーを持つ必要があるという問題を回避できます。 '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

データセットのコレクションビューを取得しようとしましたか?

CollectionViewSource.GetDefaultView(yourDataSet).SortDescriptions 

これにより、現在の並べ替えの配列が得られます。あなたはこれらを維持し、次のラウンドで次のように適用することができます。

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

希望します。

+2

うん!これは正しい解決策でなければなりません。唯一の解決策です。そして私が正しい場合は、以前の並べ替えやグループ化を "覚える"必要はありません。あなたの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 
関連する問題