在WPF DataGrid中保留用户定义的排序顺序

时间:2011-06-24 13:29:44

标签: c# wpf xaml sorting wpfdatagrid

我有一个WPF DataGrid,其中填充了DataSet中的数据。我将CanUserSortColumns设置为 true

是否可以保留用户在刷新网格时指定的排序?我保留了使用

选择的项目
  object selectedItem = dgInvoiceHeads.SelectedItem;

在刷新之前然后放置

 dgInvoiceHeads.SelectedItem = selectedItem;
刷新后发生

但我似乎无法保留指定的排序。

4 个答案:

答案 0 :(得分:4)

您是否尝试过获取数据集的集合视图?

CollectionViewSource.GetDefaultView(yourDataSet).SortDescriptions

这将为您提供当前排序规则的数组。然后你可以坚持这些,下一次应用它们如下

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

希望它有所帮助。

答案 1 :(得分: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);
    }
}

答案 2 :(得分: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

答案 3 :(得分: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