9 Stimmen

Behalten Sie die benutzerdefinierte Sortierreihenfolge in WPF DataGrid

Ich habe ein WPF DataGrid, das mit Daten aus DataSet befüllt wird. Ich habe CanUserSortColumns eingestellt auf wahr .

Ist es möglich, die vom Benutzer festgelegte Sortierung beizubehalten, wenn das Gitter aktualisiert wird? Ich habe es behalten das Element, das ausgewählt wurde mit

  object selectedItem = dgInvoiceHeads.SelectedItem;

bevor die Aktualisierung erfolgt, und dann die

 dgInvoiceHeads.SelectedItem = selectedItem;

nachdem die Aktualisierung stattgefunden hat.

Aber ich scheine es nicht zu schaffen, die angegebene Sortierung beizubehalten.

5voto

Stefan Z Camilleri Punkte 3936

Haben Sie versucht, die Sammelansicht für den Datensatz abzurufen?

CollectionViewSource.GetDefaultView(yourDataSet).SortDescriptions

Dadurch erhalten Sie ein Array mit den aktuellen Sortierbeschreibungen. Diese können Sie dann beibehalten und beim nächsten Mal wie folgt anwenden

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

Ich hoffe, es hilft.

4voto

CodeNaked Punkte 39375

Der folgende Code wurde von diesem Forumsbeitrag und zeigt, wie man die Sortierbeschreibungen und Spalteninformationen erhält und wiederherstellt.

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);
    }
}

3voto

Noelle Punkte 762

Einer meiner Kollegen hat sich das ausgedacht. Es scheint richtig zu funktionieren. Die einzige Sache ist, ich denke, die Spaltenüberschriften müssen die gleichen in der DataGrid sein, wie sie in der DB sind.

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

1voto

vidhyakp Punkte 11
 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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X