Sorting in Windows Forms ListView (SfListView)

The SfListView supports sorting the data either in ascending or descending order by using DataSource.SortDescriptors property and by using the custom logic.

Programmatic sorting

Sort the data by creating the SortDescriptor with required property name and direction and add it into the DataSource.SortDescriptors property.

SortDescriptor object holds the following three properties:

  • PropertyName: Describes the name of the sorted property.
  • Direction: Describes an object of type ListSortDirection that defines the sorting direction.
  • Comparer: Describes the comparer to be applied when sorting the items.
listView.View.SortDescriptors.Add(new SortDescriptor()
{
    PropertyName = "CountryName",
    Direction = ListSortDirection.Ascending,
});
listView.View.SortDescriptors.Add(New SortDescriptor() With {.PropertyName = "Continent", .Direction = ListSortDirection.Ascending})

Custom sorting

Sort the items based on the custom logic. It can be applied to the SfListView.DataSource.SortComparer or SortDescriptor.Comparer property added to the DataSource.SortDescriptors collection.

In custom sort comparer, all the items in SfListView is sorted with length of an item.

sfListView1.View.SortDescriptors.Add(new Syncfusion.DataSource.SortDescriptor()
{
    PropertyName = "CountryName",
    Direction = Syncfusion.DataSource.ListSortDirection.Descending,
    Comparer = new CustomSortComparer()
});
public class CustomSortComparer : IComparer<object>, ISortDirection
{
   public CustomSortComparer()
   {
      this.SortDirection = Syncfusion.DataSource.ListSortDirection.Ascending;
   }

   public Syncfusion.DataSource.ListSortDirection SortDirection
   {
      get;
      set;
   }

   public int Compare(object x, object y)
   {
       int groupX;
       int groupY;
       groupX = (x as CountryInfo).CountryName.Length;
       groupY = (y as CountryInfo).CountryName.Length;
            
        if (groupX.CompareTo(groupY) > 0)
             return SortDirection == Syncfusion.DataSource.ListSortDirection.Ascending ? 1 : -1;
        else if (groupX.CompareTo(groupY) == -1)
             return SortDirection == Syncfusion.DataSource.ListSortDirection.Ascending ? -1 : 1;
        else
             return 0;
   }
}
sfListView1.View.SortDescriptors.Add(New Syncfusion.DataSource.SortDescriptor() With {.PropertyName = "Continent", .Direction = Syncfusion.DataSource.ListSortDirection.Descending, .Comparer = New CustomGroupComparer()})
public class CustomSortComparer : IComparer(Of Object), ISortDirection
   public CustomSortComparer()
	  Me.SortDirection = Syncfusion.DataSource.ListSortDirection.Ascending

   public Syncfusion.DataSource.ListSortDirection SortDirection {get;set;}

   public Integer Compare(Object x, Object y)
	   Dim groupX As Integer
	   Dim groupY As Integer

	   groupX = (TryCast(x, CountryInfo)).CountryName.Length
	   groupY = (TryCast(y, CountryInfo)).CountryName.Length

		If groupX.CompareTo(groupY) > 0 Then
			 Return If(SortDirection = Syncfusion.DataSource.ListSortDirection.Ascending, 1, -1)
		ElseIf groupX.CompareTo(groupY) = -1 Then
			 Return If(SortDirection = Syncfusion.DataSource.ListSortDirection.Ascending, -1, 1)
		Else
			 Return 0
		End If

Sort the items with grouping

The SfListView allows sorting the items with grouping by adding the DataSource.GroupDescriptors and the DataSource.SortDescriptors with required property name.

listView.View.GroupDescriptors.Add(new GroupDescriptor()
{
   PropertyName = "Continent",                     
});
listView.View.SortDescriptors.Add(new SortDescriptor()
{
   PropertyName = "Continent",
   Direction = ListSortDirection.Descending,
});
listView.View.GroupDescriptors.Add(New GroupDescriptor() With {.PropertyName = "Continent"})
listView.View.SortDescriptors.Add(New SortDescriptor() With {.PropertyName = "Continent", .Direction = ListSortDirection.Descending})