Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sort a wpf datagrid programmatically

Is there a way to sort a WPF DataGrid programmatically (for example, like if I clicked on my first column)?

Is there a way to simulate this click?

Here is my 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)); 

I don't know why, but the line dv.Sort = "strEvtType"; causes a strange thing, my Window shows up and the program doesn't continue to execute the next lines, nevertheless, I don't see the sort!

like image 317
Walter Fabio Simoni Avatar asked Jun 06 '13 07:06

Walter Fabio Simoni


2 Answers

voo's solution was not working for me, ItemsSource was null, most likely because it was not directly set, but bound. All other solutions I found here at StackOverflow were dealing with sorting the Model only, but the DataGrid header was not reflecting to the sort.

Here's a proper solution based on the incomplete script here: 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(); } 

In case of your code, it can be used like this:

SortDataGrid(myDataGridEvenements, 0, ListSortDirection.Ascending); 

Or by using the default parameter values, simply:

SortDataGrid(myDataGridEvenements); 
like image 184
Adam Szabo Avatar answered Sep 19 '22 14:09

Adam Szabo


Get your ItemsSource's DataView and use its Sort property to specify the column you are sorting by:

(yourDataGrid.ItemsSource as DataView).Sort = "NAME_OF_COLUMN"; 
like image 34
Alex Avatar answered Sep 18 '22 14:09

Alex