'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!
Solution 1:[1]
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);
Solution 2:[2]
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";
Solution 3:[3]
Fast & Easy way:
dgv.Items.SortDescriptions.Clear();
dgv.Items.SortDescriptions.Add(new SortDescription("ID", ListSortDirection.Descending));
dgv.Items.Refresh();
Solution 4:[4]
My method is work for me. Just try this code. Sorry for Russian
// ???? ??????? ??????, ?? ??????????? ?? ? ???????
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();
Solution 5:[5]
PerformSort method of the DataGrid is what actually executed on a column's header click. However this method is internal. So if you really want to simulate the click you need to use reflection:
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] });
}
Solution 6:[6]
you can use ICollectionView to filter, sort and group your items in a datagrid.
EDIT: add Sort, did not read the question carefully :)
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;
}
Solution 7:[7]
To sort your DataGrid like if you clicked on your first column, you have to work on DataView created from WPF. In this exampe the DataGrid is sorted every time that columns are AutoGenerated but you can select other event like DataGrid1_Loaded
using System.Windows.Data;
private void DataGrid1_AutoGeneratedColumns(object sender, EventArgs e)
{
(((DataGrid)sender).ItemsSource as DataView).Sort = DataGrid1.Columns[0].Header.ToString();
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | Alex |
| Solution 3 | Saghachi |
| Solution 4 | vajarkov |
| Solution 5 | Maxim |
| Solution 6 | |
| Solution 7 |
