5,696,576 members and growing! (16,459 online)
Email Password   helpLost your password?
Desktop Development » List Controls » ListView controls     Intermediate

ListView Sorter

By gz

Custom ListViewItemSorter with pluggable cell comparators
C#, Windows, .NET 1.0, .NET, Visual Studio, Dev

Posted: 6 Aug 2002
Updated: 22 May 2003
Views: 114,199
Bookmarked: 24 times
Announcements
Loading...



Search    
Advanced Search
Sitemap
20 votes for this Article.
Popularity: 3.90 Rating: 3.00 out of 5
6 votes, 37.5%
1
2 votes, 12.5%
2
2 votes, 12.5%
3
3 votes, 18.8%
4
3 votes, 18.8%
5

Introduction

My solution is an alternative to C# Sorted ListView, posted by Carlos H.Perez. The main difference is that I'm not trying to extend ListView control at all. Instead of that I suggest using a standard ListView with customizable ListViewSorter.

The main idea is to tie ListView column headers with appropriate delegates, which can handle column cells comparison activities. So I declare ListViewSorter.Comparer delegate, and enable to store column-delegate pairs into sorter.

//column cell comparer

public delegate int Comparer(string x, string y);
//comparer for column

public Comparer this[ColumnHeader _column] {...}

The sorter itself is tied to a list control and handles the ColumnClick events for that list. On each column the click sorter activates the clicked column.

//click handler

protected void Column_Click(object sender, ColumnClickEventArgs e)
{
    //get and verify clicked list

    ListView _list = sender as ListView;
    if (_list != this.list) 
       throw new Exception("The event sender does not match the list");

    //sweap columns, which are no longer contained by the list

    CleanUp();

    //get clicked column header

    ColumnHeader _column = this.list.Columns[e.Column];

    //activate sort by that header

    SortBy(_column, this.column ! =_column || 
                    this.list.Sorting!=SortOrder.Ascending);
}

That active column later is used by sorting logic to choose correct comparer and to compare cells.

//activates sort by column

public void SortBy(ColumnHeader _column, bool asc)
{
    //validate column

    if (this.list == null) throw new Exception("The list is null");
    if (_column == null) throw new Exception("The column is null");

    //leav old sort if column is not sortable

    if (this[_column] == null) return;

    //activate column

    this.column = _column;

    //activate sort

    this.list.Sorting = SortOrder.None;
    this.list.Sorting = asc ? SortOrder.Ascending : SortOrder.Descending;
}

Bellow is cell comparison through the Comparer implementation.

//cell comparison

int IComparer.Compare(object x, object y)
{
    //validate list

    if (this.list == null || this.list.Sorting == SortOrder.None 
      || this.column == null) return 0;

    //get cells

    ListViewItem ix = x as ListViewItem;
    ListViewItem iy = y as ListViewItem;
    if (ix.ListView != this.list || iy.ListView != this.list)
        throw new Exception("The event sender does not match the list");

    //compare - use column comparer

    return
        (this.list.Sorting==SortOrder.Ascending ? 1:-1) *
        this[this.column](ix.SubItems[this.column.Index].Text, 
                          iy.SubItems[this.column.Index].Text);
}

ListViewSorter already has standard comparers (as static methods) for strings, numbers, dates.

History

  • 23 May 2003 - updated download

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

gz



Location: Lithuania Lithuania

Other popular List Controls articles:

Article Top
Sign Up to vote for this article
You must Sign In to use this message board.
FAQ FAQ Noise ToleranceSearch Search Messages 
 Layout  Per page   
 Msgs 1 to 19 of 19 (Total in Forum: 19) (Refresh)FirstPrevNext
NewsBug and fixmemberdEUs[CPP]4:00 25 Apr '06  
GeneralRe: Bug and fixmemberMustafa Sait Ozen12:27 13 Jul '06  
GeneralRe: Bug and fixmemberScott S.11:36 7 Aug '07  
GeneralSimilar Approach, But With An ExamplememberFOOS13:08 29 Mar '05  
GeneralProblem with sortingmemberrobdogg19:25 3 May '04  
GeneralFrom MSDNmembermgvinod0:28 13 Jun '03  
GeneralSorting CheckBoxesmemberShardool12:14 3 Jun '03  
GeneralListViewSortermemberRussell Mangel23:35 2 Jan '03  
GeneralRe: ListViewSortermemberdemerson14:38 14 Mar '05  
GeneralRe: ListViewSortermemberkwirq11:45 8 May '06  
GeneralListView sorting Mutex?membertimothy_M_Miller2:43 2 Oct '02  
GeneralRe: ListView sorting Mutex?memberRussell Mangel23:38 2 Jan '03  
GeneralRe: ListView sorting Mutex?membertimothy_M_Miller3:57 7 Jan '03  
GeneralRe: ListView sorting Mutex?sussAnonymous4:39 11 Jan '03  
GeneralRe: ListView sorting Mutex?membertimothy_M_Miller2:22 22 Jan '03  
GeneralRe: ListView sorting Mutex?memberChristianD9:20 20 Jan '03  
GeneralRe: ListView sorting Mutex?membertimothy_M_Miller2:35 22 Jan '03  
GeneralRe: ListView sorting Mutex?memberChristianD7:15 22 Jan '03  
GeneralRe: ListView sorting Mutex?memberdemerson9:09 15 Mar '05  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 22 May 2003
Editor: Chris Maunder
Copyright 2002 by gz
Everything else Copyright © CodeProject, 1999-2008
Web11 | Advertise on the Code Project