使用 C1Report 控件 > 数据的分组与排序 |
本节中将为你展示如何使用数据分组与排序,动态求和以及创建表达式等方式对报表中的数据进行有效的管理和组织。
数据分组
完成基本布局的设计之后,你可以按照某些字段或者其他条件对报表内容进行分组,从而使报表阅读起来更加容易。通过分组,你可以将报表更加直观的分割成几部分从而对每个分组单独进行介绍和数据汇总。报表主要依靠分组表达式来进行分组。分组表达式主要基于一个或者多个字段集,当然你也可以根据需要设置更加复杂的分组条件。
你可以使用C1ReportDesigner程序或者使用代码来实现报表的数据分组:
使用C1ReportDesigner进行分组和排序
即使不打算显示分组的页眉和页脚部分,你也可以使用分组来对数据进行排序。你可以使用C1ReportDesigner对你的报表进行分组,具体位置如下图所示。
要在报表中添加或编辑分组,你需要完成以下步骤:
注意: 你不能将备注型字段或者二进制(对象)字段用于分组和排序,这是OLEDB对此进行的限制。 |
Sorting and Grouping对话框效果如下图所示:
如果你添加了很多字段,可以通过Group列表右侧的箭头按钮改变字段的顺序。该操作将自动调整报表分组中页眉和页脚的位置。如果想要删除某个字段,可以使用Delete按钮。
完成字段设置之后,单击OK按钮关闭对话框,你可以在Designer中看到设置后的效果。报表中增加了页眉和页脚两个新的区域。新增区域(页眉和页脚)的高度均默认为0,你可以通过鼠标拖动边缘来扩展该区域。需要注意的是,页眉区域是可见的。而页脚区域是不可见的。因为在之前的对话框中,Group Header按钮已经被选中,而Group Footer按钮未被选中。不可见区域通过一个阴影图案表明该区域在报表中是不可见的。
具体实现效果如下图所示:
在新区域顶部的标题栏上的标签中,包含了该区域的名称以及分组Group By属性的值。
为了了解分组是如何工作的,你可以单击Add Data Field按钮,从菜单中选择Country选项,在新创建的分组页眉区域增加一个位置。单击选中该字段,通过改变字体Font属性使字体更为醒目一些。
使用代码添加分组和排序
好的报表并不只是简单的展示数据,更重要的是将数据有效的组织起来。C1Report使用groups来实现数据的分组和排序。为了说明分组是如何工作的,我们将回到报表主题模板的代码创建过程中,通过国籍对员工进行分组。
下面的代码将展示如何创建一个分组对象,并且根据国籍对报表内容进行分组:
Visual Basic
Visual Basic |
拷贝代码
|
---|---|
If chkGroup.Checked Then ' group employees by country, in ascending order Dim grp As Group grp = c1r.Groups.Add("GrpCountry", "Country", SortEnum.Ascending) ' format the Header section for the new group With grp.SectionHeader .Height = 500 .Visible = True f = .Fields.Add("CtlCountry", "Country", 0, 0, c1r.Layout.Width, 500) f.Calculated = True f.Align = FieldAlignEnum.LeftMiddle f.Font.Bold = True f.Font.Size = 12 f.BorderStyle = BorderStyleEnum.Solid f.BorderColor = Color.FromArgb(0, 0, 150) f.BackStyle = BackStyleEnum.Opaque f.BackColor = Color.FromArgb(150, 150, 220) f.MarginLeft = 100 End With ' sort employees by first name within each country c1r.Groups.Add("GrpName", "FirstName", SortEnum.Ascending) End If |
C#
C# |
拷贝代码
|
---|---|
if (chkGroup.Checked) { // group employees by country, in ascending order Group grp = c1r.Groups.Add("GrpCountry", "Country", SortEnum.Ascending); // format the Header section for the new group s = grp.SectionHeader; s.Height = 500; s.Visible = true; f = s.Fields.Add("CtlCountry", "Country", 0, 0, c1r.Layout.Width, 500); f.Calculated = true; f.Align = FieldAlignEnum.LeftMiddle; f.Font.Bold = true; f.Font.Size = 12; f.BorderStyle = BorderStyleEnum.Solid; f.BorderColor = Color.FromArgb(0, 0, 150); //f.BackStyle = BackStyleEnum.Opaque; f.BackColor = Color.Transparent; f.BackColor = Color.FromArgb(150, 150, 220); f.MarginLeft = 100; // sort employees by first name within each country c1r.Groups.Add("GrpName", "FirstName", SortEnum.Ascending); } |
每个分组都有页眉和页脚部分。在默认情况下,它们均不可见。但是上面的代码把页眉部分设为可见,是为了显示该分组所属的国籍。然后它使用Country字段新增了一个额外字段,并且将该字段的背景色设为纯色。
最后,代码中增加了另外一个分组,为了在国家分组中按照名字对员工排序。该分组仅用于排序,因此页眉和页脚部分都是不可见的。
完成设置之后,你需要调用Render方法呈现报表从而完成本例程。在btnEmployees_Click的事件处理器中输入下面的代码:
Visual Basic
Visual Basic |
拷贝代码
|
---|---|
' render the report into the PrintPreviewControl ppv.Document = c1r |
C#
C# |
拷贝代码
|
---|---|
// render the report into the PrintPreviewControl ppv.Document = c1r; |
下图为使用分组报表的实际效果图:
数据排序:
你可以使用下面两种方式对数据进行排序:
使用DataView.Sort属性进行排序,你只需要使用一个列名列表(不需要列名表达式)。因此,如果你使用DatePart("yyyy", dateColumn)作为分组表达式,控件将自动根据dateColunm字段中的日期字段进行排序,而不是像你所想的那样使用日期中的年份。
根据日期排序,需要在数据表中增加一个计算列(通过修改SQL语句),然后根据计算列中的内容对报表进行分组或者排序。下面将为你展示一个XML的Sort属性,并举例说明这一过程。
下图为你展示的就是C1ReportDesigner中的Sorting and Grouping编辑器。你可以通过指定字段来实现分组排序:
如果你同时使用上述两种方法,在报表中设置的Sort属性将具备更高的优先级(它应用于数据从数据库中检索之后)。
注意:完整的报表,可参阅在报表模板文件下CommonTasks.xml文件的"19: Sorting"章节,该文件保存在ComponentOne示例文件目录下。 |