Click here to Skip to main content
11,412,516 members (71,050 online)
Click here to Skip to main content

Groupable ListView

, 15 Sep 2006 CPOL
Rate this:
Please Sign up or sign in to vote.
Extended ListView with GUIs for easy grouping.

Sample Image - GroupableListView.png

Introduction

Some time ago, I thought about writing a small extension to the ListView control. This would dynamically create a graphic user interface to allow the end-user create/modify groups, something like ‘GROUP BY’ in SQL. The control will automatically create a ToolStrip and a ToolStripButton for each column.

Usage

To use the control, just add ExListView.cs to your project, and switch the GroupsGUIs property to true, if you want to give the possibility to group items for the users.

Properties

  • GroupsGUIs - Show or not the ToolStrip to allow group items.
  • ToolStripImage - The image to show on ToolStripButtons of the groups.
  • ShowGroupLabel - Show or hide the 'ShowGroup' label.
  • ShowGroupLabelText - The 'ShowGroup' label. Default: 'Group by:'.

Example

I prepared a small example project, with a ListView which contains some employees. Each employee has a name, sex, and a job. So, if the user wants to group the employees by sex, he just needs to press one button, and the ListView will analyze each ListViewItem and create groups for the data. It creates one group for each different data in selected colums.

Here you see an example of ListView, grouped by Sex and Job:

Sample Image - GroupableListView.png

Code

To analyze and create the groups, I wrote a GroupBy(ColumnHeader[] Headers) method, it’s a simple thread-safe method with a few loops which add groups for each new different data found.

delegate void dGroupBy(ColumnHeader[] Headers);
public void GroupBy(ColumnHeader[] Headers)
{
    if (this.InvokeRequired)
    {
        dGroupBy d = new dGroupBy(GroupBy);
        this.Invoke(d, new object[] { Headers });
    }
    else
    {
        //code
        foreach (ListViewItem lvi in this.Items)
        {
            string header = "";

            foreach (ColumnHeader ch in Headers)
            {
                header += " " + 
                   lvi.SubItems[ch.Index].Text;
            }
            ListViewGroup group = 
                new ListViewGroup(header);
            ListViewGroup found = null;
            foreach (ListViewGroup g in Groups)
            {
                if (g.Header == group.Header)
                { found = g; break; }
            }
            if (found == null)
            {
                this.Groups.Add(group);
                group.Items.Add(lvi);
            }
            else
            {
                found.Items.Add(lvi);
            }
        }
    }
}

Sample Image - GroupableListView.png

History

  • 06/09/06 – v.1.01: Dock fill bug fixed.
  • 20/08/06 – Initial release.

License

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

Share

About the Author

Kel_
Chief Technology Officer Misakai Ltd.
Ireland Ireland
Roman Atachiants is the guy behind www.spike-engine.com project, a real-time, client-server networking layer (SOA, RPC) for .NET developers. Also the founder of Misakai Ltd..

He is a software engineer and scientist with extensive experience in different computer science domains, programming languages/principles/patterns & frameworks.

His main expertise consists of C# and .NET platform, game technologies, cloud, human-computer interaction, big data and artificial intelligence. He has an extensive programming knowledge and R&D expertise.


Follow on   Twitter

Comments and Discussions

 
QuestionBad Pin
Member 11643908 at 5hrs 57mins ago
memberMember 116439085hrs 57mins ago 
GeneralVery nice extension! Pin
Sam Jacobs at 17-Mar-10 13:40
memberSam Jacobs17-Mar-10 13:40 
Generalwrite text in Grouping Pin
Rohit Mahajan at 21-May-08 22:39
memberRohit Mahajan21-May-08 22:39 
GeneralVista Style Group/Sort Pin
Alexandru Stanciu at 27-Feb-08 18:54
memberAlexandru Stanciu27-Feb-08 18:54 
QuestionNo scroll bar Pin
Bill W at 15-Nov-07 5:29
memberBill W15-Nov-07 5:29 
QuestionStrange Issue Pin
-_-_-_-_-_ at 22-Aug-07 22:10
member-_-_-_-_-_22-Aug-07 22:10 
AnswerRe: Strange Issue Pin
-_-_-_-_-_ at 22-Aug-07 22:18
member-_-_-_-_-_22-Aug-07 22:18 
QuestionWidth-Problem when ListView in LargeIcon-Mode Pin
Stephan Mantel at 17-Jun-07 4:21
memberStephan Mantel17-Jun-07 4:21 
GeneralGrouping Sorted Pin
chancer101 at 16-May-07 5:56
memberchancer10116-May-07 5:56 
GeneralSeem a bug Pin
dvptUml at 3-Apr-07 17:05
memberdvptUml3-Apr-07 17:05 
Sorry, i'm not a programmer, just a financial manager !! and i never wrote an article (not enough time to learn programming...).
But i think i've found that bug : when you set a group and then unset it (and nor category is set), the border line still appear.
May I suggest to add in the void tsb_Click(object sender, EventArgs e) method after HeaderGroup.Remove... the following:
if (HeaderGroup.Count == 0)
{
  this.Group.Clear();
  return; // nothing to ask 'GroupBy'
}
I hope i'm not wrong since nobody told this ....

Not a programmer but DvptUml is my credo
Generaluse combobox instead of a toolstrip... [modified] Pin
TheCardinal at 17-Oct-06 22:04
memberTheCardinal17-Oct-06 22:04 
QuestionExpand/Collapse Group Pin
riz332 at 3-Oct-06 23:06
memberriz3323-Oct-06 23:06 
AnswerRe: Expand/Collapse Group Pin
sonofdaedalus at 24-Jan-07 9:23
membersonofdaedalus24-Jan-07 9:23 
QuestionRe: Expand/Collapse Group Pin
Soxiz at 11-Jun-07 12:32
memberSoxiz11-Jun-07 12:32 
QuestionA Question Pin
phonefans at 15-Sep-06 8:41
memberphonefans15-Sep-06 8:41 
AnswerRe: A Question Pin
Kel_ at 15-Sep-06 10:47
memberKel_15-Sep-06 10:47 
GeneralRe: A Question Pin
phonefans at 15-Sep-06 17:52
memberphonefans15-Sep-06 17:52 
GeneralThanks but there is no group if listview is full dock Pin
jvhow at 5-Sep-06 21:59
memberjvhow5-Sep-06 21:59 
GeneralRe: Thanks but there is no group if listview is full dock Pin
Kel_ at 5-Sep-06 23:00
memberKel_5-Sep-06 23:00 
GeneralI think its great. Pin
ilovthecov at 29-Aug-06 2:16
memberilovthecov29-Aug-06 2:16 
GeneralRe: I think its great. Pin
Kel_ at 29-Aug-06 2:24
memberKel_29-Aug-06 2:24 
Questiontree diagram produced by ? Pin
BillWoodruff at 26-Aug-06 2:11
memberBillWoodruff26-Aug-06 2:11 
AnswerRe: tree diagram produced by ? Pin
Kel_ at 26-Aug-06 6:51
memberKel_26-Aug-06 6:51 
QuestionWhy this code ???? Pin
DotNET74 at 22-Aug-06 8:04
memberDotNET7422-Aug-06 8:04 
AnswerRe: Why this code ???? Pin
Steven Roebert at 22-Aug-06 12:07
memberSteven Roebert22-Aug-06 12:07 
QuestionReturn of Groupable ListView ....? Pin
Mahesh Sapre at 20-Aug-06 21:29
memberMahesh Sapre20-Aug-06 21:29 
AnswerRe: Return of Groupable ListView ....? Pin
davepermen at 20-Aug-06 22:01
memberdavepermen20-Aug-06 22:01 
GeneralNice idea! Pin
Martin Lundberg at 20-Aug-06 10:10
memberMartin Lundberg20-Aug-06 10:10 
GeneralRe: Nice idea! Pin
Kel_ at 20-Aug-06 13:12
memberKel_20-Aug-06 13:12 
GeneralRe: Nice idea! Pin
PaulC1972 at 22-Aug-06 9:14
memberPaulC197222-Aug-06 9:14 
GeneralRe: Nice idea! Pin
Jecc at 11-Sep-06 22:59
memberJecc11-Sep-06 22:59 
GeneralAwwww Pin
Ed.Poore at 20-Aug-06 10:05
memberEd.Poore20-Aug-06 10:05 
GeneralRe: Awwww Pin
Kel_ at 20-Aug-06 13:14
memberKel_20-Aug-06 13:14 
GeneralRe: Awwww Pin
Ed.Poore at 20-Aug-06 14:49
memberEd.Poore20-Aug-06 14:49 
GeneralRe: Awwww Pin
Jamie Nordmeyer at 15-Sep-06 12:52
memberJamie Nordmeyer15-Sep-06 12:52 
GeneralRe: Awwww Pin
Ed.Poore at 17-Sep-06 9:33
memberEd.Poore17-Sep-06 9:33 
QuestionRe: Awwww Pin
pinkjones at 6-Nov-06 5:08
memberpinkjones6-Nov-06 5:08 
AnswerRe: Awwww Pin
Jamie Nordmeyer at 6-Nov-06 5:19
memberJamie Nordmeyer6-Nov-06 5:19 
GeneralNice! Pin
dzCepheus at 20-Aug-06 9:34
memberdzCepheus20-Aug-06 9:34 
GeneralRe: Nice! Pin
Kel_ at 20-Aug-06 13:11
memberKel_20-Aug-06 13:11 

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

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

| Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.150427.1 | Last Updated 15 Sep 2006
Article Copyright 2006 by Kel_
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid