以下主题将为您展示如何使用C1ReportDesigner应用程序或代码创建一个报表定义。注意创建报表定义与呈现报表不同。当呈现报表时,你只需加载一个已有的定义并调用Render方法。
使用C1ReportDesigner创建一个报表定义
创建报表定义最简单的方法就是使用C1ReportDesigner应用程序,它是一个独立的应用程序,类似于Microsoft Access中的报表设计器。C1Report Wizard会从开始步骤到结束步骤引导你创建一个新的报表。
关于创建新报表步骤的更多信息,请查看“创建一个基本报表定义”。
关于创建新报表步骤的更多信息,请查看“创建一个基本报表定义.”。
你还可以从头开始使用代码创建报表。此方案需要一些额外的工作量,但它非常灵活。你甚至可以编写自己的报表设计器或专门报表生成器。
以下示例使用代码创建了一个基于NorthWind数据库的简单列表报表定义。代码添加了注释,说明了C1Report对象模型的最重要的元素。完成下列步骤:
Visual Basic
Visual Basic |
拷贝代码
|
---|---|
Private Sub RenderEmployees() With c1r ' 清除任何已有的字段 .Clear() ' 为所有控件设置默认字体 .Font.Name = "Tahoma" .Font.Size = 8 End With |
C#
C# |
拷贝代码
|
---|---|
private void RenderEmployees() { // 清除任何已有的字段 c1r.Clear(); // 为所有控件设置默认字体 c1r.Font.Name = "Tahoma"; c1r.Font.Size = 8; } |
接下来,设置DataSource 对象,从NorthWind数据库检索你想要的数据。使用ConnectionString 和RecordSource属性完成(类似 Microsoft ADO DataControl):
Visual Basic
Visual Basic |
拷贝代码
|
---|---|
' 初始化数据源 With c1r.DataSource .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\...\ComponentOne Samples\Common\Nwind.mdb;" & _ "Persist Security Info=False" .RecordSource = "Employees" End With |
C#
C# |
拷贝代码
|
---|---|
// 初始化数据源 DataSource ds = c1r.DataSource; ds.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\...\ComponentOne Samples\Common\Nwind.mdb;"; ds.RecordSource = "Employees"; |
接下来,初始化Layout对象,它定义了报表在页面上的布局方式。在此示例中,纵向呈现报表,将宽度设为6.5英寸(8.5英尺的页宽减去两侧一英尺的边距):
Visual Basic
Visual Basic |
拷贝代码
|
---|---|
' 初始化布局 With c1r.Layout .Orientation = OrientationEnum.Portrait .Width = 6.5 * 1440 '8.5 – 边距, 单位为缇 End With |
C#
C# |
拷贝代码
|
---|---|
// 初始化布局 Layout l = c1r.Layout; l.Orientation = OrientationEnum.Portrait; l.Width = 6.5 * 1440; //8.5 – 边距, 单位为缇 |
现在是非常有趣的一部分。每个报表均有五个基本部分:细节、报表标题、报表页脚、页眉和页脚。使用以下代码通过设置若干属性和添加一个标题字段,来设置报表标题:
Visual Basic
Visual Basic |
拷贝代码
|
---|---|
' 创建和格式化报表字段的变量 Dim f As Field ' 创建一个报表标题 With c1r.Sections(SectionTypeEnum.Header) .Height = 1440 .Visible = True .BackColor = Color.FromArgb(200, 200, 200) f = .Fields.Add("FldTitle", "Employees Report", 0, 0, 8000, 1440) f.Font.Size = 24 f.Font.Bold = True f.ForeColor = Color.FromArgb(0, 0, 100) End With |
C#
C# |
拷贝代码
|
---|---|
// 创建和格式化报表字段的变量 Field f; // 创建一个报表标题 Section s = c1r.Sections[SectionTypeEnum.Header]; s.Height = 1440; s.Visible = true; s.BackColor = Color.FromArgb(200, 200, 200); f = s.Fields.Add("FldTitle", "Employees Report", 0, 0, 8000, 1440); f.Font.Size = 24; f.Font.Bold = true; f.ForeColor = Color.FromArgb(0, 0, 100); |
section对象有一个字段集合。集合的Add方法创建了一个新的字段,并将它赋给Section。参数指定了新字段的名称、文本、左、顶、宽度和高度属性。默认情况下,字段和控件的字体相同。注意字段应该足够高以便适应字体大小,否则字段里将不会显示任何东西。
8. 然后,设置页脚Section。这个section更加有趣,因为它包括计算字段。计算字段在它们的Text属性里包含了VBScript表达式,在呈现报表时进行评估。若想将一个字段设置为可计算的,将其Calculated属性设为True 即可。使用以下代码创建一个页脚:
Visual Basic
Visual Basic |
拷贝代码
|
---|---|
' 创建一个页脚 With c1r.Sections(SectionTypeEnum.PageFooter) .Height = 500 .Visible = True f = .Fields.Add("FldFtrLeft", """Employees: Printed on "" & Now",_ 0, 0, 4000, 300) f.Calculated = True f = .Fields.Add("FldFtrRight", """Page "" & Page & "" of "" & Pages",_ 4000, 0, 4000, 300) f.Calculated = True f.Align = FieldAlignEnum.RightTop f.Width = c1r.Layout.Width - f.Left f = .Fields.Add("FldLine", "", 0, 0, c1r.Layout.Width, 20) f.LineSlant = LineSlantEnum.NoSlant f.BorderStyle = BorderStyleEnum.Solid f.BorderColor = Color.FromArgb(0, 0, 100) End With |
C#
C# |
拷贝代码
|
---|---|
// 创建一个页脚 s = c1r.Sections[SectionTypeEnum.PageFooter]; s.Height = 500; s.Visible = true; f = s.Fields.Add("FldFtrLeft", @"""Employees: Printed on "" & Now",_ 0, 0, 4000, 300); f.Calculated = true; f = .Fields.Add("FldFtrRight", @"""Page "" + Page + "" of "" & Pages",_ 4000, 0, 4000, 300); f.Calculated = true; f.Align = FieldAlignEnum.RightTop; f.Width = c1r.Layout.Width - f.Left; f = s.Fields.Add("FldLine", "", 0, 0, c1r.Layout.Width, 20); f.LineSlant = LineSlantEnum.NoSlant; f.BorderStyle = BorderStyleEnum.Solid; f.BorderColor = Color.FromArgb(0, 0, 100); |
页脚section使用含有变量的表达式,不一定是固有的VBScript,但需由C1Report定义。Page和Pages是包含当前页码和总页数的变量。section还使用了一个配置字段,使其看起来像一条线。使用属性B+orderStyle和LineSlant即可完成。
接下来,设置页眉Section。这个section会在每页顶端显示,并显示字段标签。在表格报表中,使用一个页眉section显示字段标签是一种常见的技术。代码简单,但由于所有的实地测量,它看起来有些乱。在实际的应用程序中,这些值不会硬编码到程序中。添加以下代码来创建一个包含字段标签的页眉:
Visual Basic
Visual Basic |
拷贝代码
|
---|---|
'创建一个包含字段标签的页眉 With c1r.Sections(SectionTypeEnum.PageHeader) .Height = 500 .Visible = True c1r.Font.Bold = True f = .Fields.Add("LblID", "ID", 0, 50, 400, 300) f.Align = FieldAlignEnum.RightTop f = .Fields.Add("LblFirstName", "First", 500, 50, 900, 300) f = .Fields.Add("LblLastName", "Last", 1500, 50, 900, 300) f = .Fields.Add("LblTitle", "Title", 2500, 50, 2400, 300) f = .Fields.Add("LblTitle", "Notes", 5000, 50, 8000, 300) c1r.Font.Bold = False f = .Fields.Add("FldLine", "", 0, 400, c1r.Layout.Width, 20) f.LineSlant = LineSlantEnum.NoSlant f.LineWidth = 50 f.BorderColor = Color.FromArgb(100, 100, 100) End With |
C#
C# |
拷贝代码
|
---|---|
// 创建一个包含字段标签的页眉 s = c1r.Sections[SectionTypeEnum.PageHeader]; s.Height = 500; s.Visible = true; c1r.Font.Bold = true; f = s.Fields.Add("LblID", "ID", 0, 50, 400, 300); f.Align = FieldAlignEnum.RightTop; f = s.Fields.Add("LblFirstName", "First", 500, 50, 900, 300); f = s.Fields.Add("LblLastName", "Last", 1500, 50, 900, 300); f = s.Fields.Add("LblTitle", "Title", 2500, 50, 2400, 300); f = s.Fields.Add("LblTitle", "Notes", 5000, 50, 8000, 300); c1r.Font.Bold = false; f = s.Fields.Add("FldLine", "", 0, 400, c1r.Layout.Width, 20); f.LineSlant = LineSlantEnum.NoSlant; f.LineWidth = 50; f.BorderColor = Color.FromArgb(100, 100, 100); |
这段代码演示了处理字体的一个强大技术。由于每个字段在创建时继承了控件的字体,在创建字段前将控件的Font.Bold属性设置为True,然后将其设回False。因此,页眉部分的所有控件均为粗体。
为了完成这份报表,需要添加细节Section。这部分显示了实际的数据。在页眉部分每一个标签下有一个计算字段。添加以下代码创建细节section:
Visual Basic
Visual Basic |
拷贝代码
|
---|---|
' With c1r.Sections(SectionTypeEnum.Detail) .Height = 330 .Visible = True f = .Fields.Add("FldID", "EmployeeID", 0, 0, 400, 300) f.Calculated = True f = .Fields.Add("FldFirstName", "FirstName", 500, 0, 900, 300) f.Calculated = True f = .Fields.Add("FldLastName", "LastName", 1500, 0, 900, 300) f.Calculated = True f = .Fields.Add("FldTitle", "Title", 2500, 0, 2400, 300) f.Calculated = True f = .Fields.Add("FldNotes", "Notes", 5000, 0, 8000, 300) f.Width = c1r.Layout.Width - f.Left f.Calculated = True f.CanGrow = True f.Font.Size = 6 f.Align = FieldAlignEnum.JustTop f = .Fields.Add("FldLine", "", 0, 310, c1r.Layout.Width, 20) f.LineSlant = LineSlantEnum.NoSlant f.BorderStyle = BorderStyleEnum.Solid f.BorderColor = Color.FromArgb(100, 100, 100) End With |
C#
C# |
拷贝代码
|
---|---|
// 创建Detail区域 s = c1r.Sections[SectionTypeEnum.Detail]; s.Height = 330; s.Visible = true; f = s.Fields.Add("FldID", "EmployeeID", 0, 0, 400, 300); f.Calculated = true; f = s.Fields.Add("FldFirstName", "FirstName", 500, 0, 900, 300); f.Calculated = true; f = s.Fields.Add("FldLastName", "LastName", 1500, 0, 900, 300); f.Calculated = true; f = s.Fields.Add("FldTitle", "Title", 2500, 0, 2400, 300); f.Calculated = true; f = s.Fields.Add("FldNotes", "Notes", 5000, 0, 8000, 300); f.Width = c1r.Layout.Width - f.Left; f.Calculated = true; f.CanGrow = true; f.Font.Size = 6; f.Align = FieldAlignEnum.JustTop; f = s.Fields.Add("FldLine", "", 0, 310, c1r.Layout.Width, 20); f.LineSlant = LineSlantEnum.NoSlant; f.BorderStyle = BorderStyleEnum.Solid; f.BorderColor = Color.FromArgb(100, 100, 100); |
注意所有字段已计算,它们的Text属性对应记录集源中字段的名称。设置Calculated属性为True,确保Text属性被解释为一个数据库的名称,而不是直接显示。报表字段采用一个命名规范十分重要,这使得它们唯一,且不同于其他记录集的字段名称。如果你有两个名为"LastName"的字段,表达式如"Left(LastName,1)" 的含义将变得模糊。此示例采用了统一的命名规范,在所有报表字段名称前加上了"Fld"。
还要注意 "FldNotes" 字段需将CanGrow属性设为True,且字体大小比其他的小。这确保了数据库中包含大量文本的“Notes”字段会显示在报表中。字段不会变得很高以免浪
费空间。将CanGrow属性设为True告诉了控件按内容的需要扩展字段,它同时将包含部分的CanGrow属性设为True,这样字段将不会使此部分变大。
报表定义已经完成。为了在C1PrintPreview控件中显示报表,双击Employees按钮为btnEmployees_Click事件添加一个事件处理程序。代码编辑器将会打开,插入点处在事件处理程序的位置。输入以下代码:
Visual Basic
Visual Basic |
拷贝代码
|
---|---|
RenderEmployees() ' 在C1PrintPreview控件中显示报表 ppv.Document = c1r |
C#
C# |
拷贝代码
|
---|---|
RenderEmployees(); // 在C1PrintPreview控件中显示报表 ppv.Document = c1r; |
下面为基本报表的外观: