Click here to Skip to main content
15,868,016 members
Articles / Desktop Programming / Windows Forms

ListView Group Sorter

Rate me:
Please Sign up or sign in to vote.
5.00/5 (9 votes)
17 Aug 2009CPOL 79.8K   3.8K   61   2
An easy to use ListView group sorter (very simple).
Sorted Ascending

Image 1

Sorted Descending

Desc.jpg

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:

C#
((ListViewGroupSorter)listView1).SortGroups(true);  //Ascending...
((ListViewGroupSorter)listView1).SortGroups(false); //Descending...

The ListViewGroupHeaderSorter Class

C#
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

C#
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.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer
Denmark Denmark

Comments and Discussions

 
GeneralItem sort Pin
Alan Obee21-Jan-14 0:34
Alan Obee21-Jan-14 0:34 
Great Article!

Sorting the group works great but how do you also sort the items within the group?

Thanks!
GeneralRe: Item sort Pin
Paw Jershauge22-Jan-14 10:13
Paw Jershauge22-Jan-14 10:13 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.