65.9K
CodeProject 正在变化。 阅读更多。
Home

DataGridViewGrouper

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.95/5 (30投票s)

2015 年 5 月 29 日

CPOL

3分钟阅读

viewsIcon

149208

downloadIcon

12578

DataGridViewGrouper:为 .NET DataGridView 添加分组功能

引言

DataGridViewGrouper 是一个可以将分组功能添加到任何现有的 DataGridView 的组件。该组件可以在设计器中添加,也可以在代码中添加。 可选地,可以使用一个控件 (DataGridViewGrouperControl) 来提供一个用户界面以更改分组设置。

背景

该组件是我在 2008 年编写并在 blogs.vbcity.com/hotdog/archive/2008/12/19/9225.aspx (已不再可用) 上发布的。 那是一个主要版本,尽管它已经很久没有更新了,但我每天都在自定义应用程序中使用该组件及其控件,并且它包含了旧版本没有的许多功能。

Using the Code

要简单地开始分组,可以在设计器中添加该组件,或者动态添加。 可以使用适当的函数之一或附加自定义分组器来启动分组。

对某个属性(在本例中称为 AString)进行网格分组所需的所有代码

var grouper = new Subro.Controls.DataGridViewGrouper(dataGridView1);
grouper.SetGroupOn("AString");

将创建类似的内容

注意:测试项目生成随机数据,因此显示的数据将有所不同。

用于格式化/排序/折叠等 Miscellaneous 选项可以在代码中设置,也可以使用随附的包装器控件设置

下拉列表包含网格所绑定的任何源的列

各种选项可以通过次级选项按钮设置

当然,这些选项可以在代码中设置,也可以借助随附的 toolstripmenuitem,该项可以添加到 contextmenu 或其他菜单中。

在示例中,使用了 string,但通过使用 PropertyDescriptor/DataGridViewColumn 或 lambda 表达式可以实现相同的功能。 例如,这些与使用 string 具有相同的作用

 grouper.SetGroupOn<TestData>(t => t.AString);
 grouper.SetGroupOn(this.dataGridView1.Columns["AString"]);

此外,可以将自定义分组器分配给 GroupOn 属性(任何继承自 GroupingInfo 的类)。 如果需要,以后可以将其更改为接口。

或者使用 SetCustomGroup 方法

grouper.SetCustomGroup<TestData>(t => t.AnInt % 10, "Mod 10");

一些进一步的例子

//to start with all rows collapsed on a (re)load or 
//when the group is changed you can set the option startcollapsed:
grouper.Options.StartCollapsed = true;

//to collapse all loaded rows: (the difference with setting the option above, 
//is that after choosing a new grouping (or on a reload), the new groups would expand.
grouper.CollapseAll();

//if you don't want the (rowcount) to be shown in the headers:
grouper.Options.ShowCount = false;

//if you don't want the grouped column name to be repeated in the headers:
grouper.Options.ShowGroupName = false;

//default sort order for the groups is ascending, 
//you can change that in the options as well (ascending, descending or none)
grouper.Options.GroupSortOrder = SortOrder.Descending;

折叠所有的一个例子

该组件公开了一个 GroupingChanged 事件,用于捕获分组已更改或删除的时间。 还有一个 DisplayGroup 事件,该事件在绘制任何分组行时触发。 DisplayGroup 事件可用于进一步自定义必须显示的内容

//grouper.DisplayGroup += grouper_DisplayGroup;
          
void grouper_DisplayGroup(object sender, GroupDisplayEventArgs e)
{
    e.BackColor = (e.Group.GroupIndex % 2) == 0 ? Color.Orange : Color.LightBlue;
    e.Header = "[" + e.Header + "], grp: " + e.Group.GroupIndex;
    e.DisplayValue = "Value is " + e.DisplayValue;
    e.Summary = "contains " + e.Group.Count + " rows";
}

上面的代码片段将产生类似的内容

关注点

该类库是从一个更大的控件库中提取的。 这里仍然缺少的一件事是快速分组上下文菜单项,它将分组设置在右键点击所在列上,这正是我到目前为止使用的应用程序中使用分组的主要方式。 然而,上下文菜单与库及其自定义 ORM 集成得有点紧密,无法在此处快速添加。 如果有人感兴趣,我稍后会添加它,包括它的快速筛选选项。

另一个注意事项:该库还包含一些搜索框(用于 DataGridView/Treeview 和一般的 bindingsource)。 在此未记录,但完全可用。 只需将其拖放到表单上并附加适当的控件即可。

历史

  • 2008:vbcity 博客上的第一稿
  • 2015-05-28 现有生产版本的首次发布
© . All rights reserved.