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 ToolStripButton
s 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:
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
{
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);
}
}
}
} |
|
History
- 06/09/06 � v.1.01: Dock fill bug fixed.
- 20/08/06 � Initial release.