Sorted Ascending

Sorted Descending

Introduction
The code descried here enables you to sort ListView Groups, ascending or descending.
Background
I needed a "quick and dirty" solution to sort my Groups in a ListView. So I came up with this very very simple solution.
Using the code
Just cast your ListView into my listview wrapper and call SortGroup(bool).
Like this where listView1 is your own ListView to be sorted:
((ListViewGroupSorter)listView1).SortGroups(true); ((ListViewGroupSorter)listView1).SortGroups(false);
The ListViewGroupHeaderSorter Class
public class ListViewGroupHeaderSorter : IComparer<ListViewGroup>
{
private bool _ascending = true;
public ListViewGroupHeaderSorter(bool ascending)
{
_ascending = ascending;
}
#region IComparer<ListViewGroup> Members
public int Compare(ListViewGroup x, ListViewGroup y)
{
if (_ascending)
return string.Compare(((ListViewGroup)x).Header, ((ListViewGroup)y).Header);
else
return string.Compare(((ListViewGroup)y).Header, ((ListViewGroup)x).Header);
}
#endregion
}
The ListViewGroupHeaderSorter Class
public class ListViewGroupSorter
{
internal ListView _listview;
public static bool operator ==(ListView listview, ListViewGroupSorter sorter)
{
return listview == sorter._listview;
}
public static bool operator !=(ListView listview, ListViewGroupSorter sorter)
{
return listview != sorter._listview;
}
public static implicit operator ListView(ListViewGroupSorter sorter)
{
return sorter._listview;
}
public static implicit operator ListViewGroupSorter(ListView listview)
{
return new ListViewGroupSorter(listview);
}
internal ListViewGroupSorter(ListView listview)
{
_listview = listview;
}
public void SortGroups(bool ascending)
{
_listview.BeginUpdate();
List<listviewgroup> lvgs = new List<listviewgroup>();
foreach (ListViewGroup lvg in _listview.Groups)
lvgs.Add(lvg);
_listview.Groups.Clear();
lvgs.Sort(new ListViewGroupHeaderSorter(ascending));
_listview.Groups.AddRange(lvgs.ToArray());
_listview.EndUpdate();
}
#region overridden methods
public override bool Equals(object obj)
{
return _listview.Equals(obj);
}
public override int GetHashCode()
{
return _listview.GetHashCode();
}
public override string ToString()
{
return _listview.ToString();
}
#endregion
}
History
- 17. Aug. 2009 - First version posted.