web-dev-qa-db-fra.com

Trier une grille de données wpf par programme

Existe-t-il un moyen de trier un WPF DataGrid par programmation (par exemple, comme si je cliquais sur ma première colonne).

Existe-t-il un moyen de simuler ce clic? Ou une meilleure façon?

Voici mon code:

Collection_Evenements = new ObservableCollection<Evenement>();

Collection_Evenements = myEvenement.GetEvenementsForCliCode(App.obj_myClient.m_strCode);
Collection_Evenements.CollectionChanged += Collection_Evenements_CollectionChanged;
myDataGridEvenements.ItemsSource = Collection_Evenements;

System.Data.DataView dv = (System.Data.DataView)myDataGridEvenements.ItemsSource;
dv.Sort = "strEvtType";

myDataGridEvenements.Focus();
myDataGridEvenements.SelectedIndex = 0;
myDataGridEvenements.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));

Je ne sais pas pourquoi, mais la ligne "dv.Sort =" strEvtType ";" cause une chose étrange, ma fenêtre s'affiche et le programme ne continue pas d'exécuter les lignes suivantes, néanmoins je ne vois pas le tri!

Merci beaucoup,

Meilleures salutations,

Nixeus

23

la solution de voo ne fonctionnait pas pour moi, ItemsSource était nulle, probablement parce qu'elle n'était pas directement définie, mais liée. Toutes les autres solutions que j'ai trouvées ici à StackOverflow concernaient uniquement le tri du modèle, mais l'en-tête DataGrid ne reflétait pas le tri.

Voici une solution appropriée basée sur le script incomplet ici: http://dotnetgui.blogspot.co.uk/2011/02/how-to-properly-sort-on-wpf-datagrid.html

public static void SortDataGrid(DataGrid dataGrid, int columnIndex = 0, ListSortDirection sortDirection = ListSortDirection.Ascending)
{
    var column = dataGrid.Columns[columnIndex];

    // Clear current sort descriptions
    dataGrid.Items.SortDescriptions.Clear();

    // Add the new sort description
    dataGrid.Items.SortDescriptions.Add(new SortDescription(column.SortMemberPath, sortDirection));

    // Apply sort
    foreach (var col in dataGrid.Columns)
    {
        col.SortDirection = null;
    }
    column.SortDirection = sortDirection;

    // Refresh items to display sort
    dataGrid.Items.Refresh();
}

Dans le cas de votre code, il peut être utilisé comme ceci:

SortDataGrid(myDataGridEvenements, 0, ListSortDirection.Ascending);

Ou en utilisant les valeurs des paramètres par défaut, simplement:

SortDataGrid(myDataGridEvenements);
38
Adam Szabo

Obtenez le DataView de votre ItemsSource et utilisez sa propriété Sort pour spécifier la colonne selon laquelle vous triez:

(yourDataGrid.ItemsSource as DataView).Sort = "NAME_OF_COLUMN";
6
Alex

PerformSort la méthode du DataGrid est ce qui est réellement exécuté sur le clic d'en-tête d'une colonne. Cependant, cette méthode est interne. Donc, si vous voulez vraiment simuler le clic vous devez utiliser la réflexion:

public static void SortColumn(DataGrid dataGrid, int columnIndex)
{
    var performSortMethod = typeof(DataGrid)
                            .GetMethod("PerformSort",
                                       BindingFlags.Instance | BindingFlags.NonPublic);

    performSortMethod?.Invoke(dataGrid, new[] { dataGrid.Columns[columnIndex] });
}
3
Maxim

Ma méthode fonctionne pour moi. Essayez simplement ce code. Désolé pour le russe

// Если таблица пустая, то привязываем ее к журналу 
            if(dgEvents.ItemsSource == null)
                dgEvents.ItemsSource = events.Entries;
            // Обновляем записи
            CollectionViewSource.GetDefaultView(dgEvents.ItemsSource).Refresh();
            // Очищаем описание сортировки
            dgEvents.Items.SortDescriptions.Clear();
            // Созадем описание сортировки
            dgEvents.Items.SortDescriptions.Add(new SortDescription(dgEvents.Columns[0].SortMemberPath, ListSortDirection.Descending));

            // Очищаем сортировку всех столбцов
            foreach (var col in dgEvents.Columns)
            {
                col.SortDirection = null;
            }
            // Задаем сортировку времени по убыванию (последняя запись вверху)
            dgEvents.Columns[0].SortDirection = ListSortDirection.Descending;
            // Обновляем записи
            dgEvents.Items.Refresh();
1
vajarkov

vous pouvez utiliser ICollectionView pour filtrer, trier et regrouper vos éléments dans une grille de données.

EDIT: ajouter Sort, n'a pas lu attentivement la question :)

 var view = CollectionViewSource.GetDefaultView(this.MyData);
 view.Filter = ViewFilter;
 view.SortDescriptions.Add(new SortDescription("MyPropertyToSort", ListSortDirection.Descending));


    private bool ViewFilter(object obj)
    {
        var item = obj as MyObject;

        if (item == null)
            return false;

        //your filter logik goes here

        if(item.MyStringProp.StartsWith("Test"))
            return false;

        return true;


   }
0
blindmeis