以下内容主要讲述显示如何使用FlexReportDesigner应用程序和代码创建报表定义。请注意,创建报表与呈现报表不同。要呈现报表,您可以简单地加载现有定义并调用C1FlexReport.Render方法。创建报表定义的最简单方法是使用C1FlexReportDesigner报表设计器,它是一个独立的应用程序,类似于Microsoft Access和Crystal Report中的报表设计器。
该应用名称为C1FlexReportDesigner.exe(64位平台)和C1FlexReportDesigner32.4.exe(32位平台)在您的计算机位于C:\Program Files (x86)\ComponentOne\Apps\v4.5.2
使用FlexReportDesigner创建报表:
您可以使用FlexReport向导在FlexReportDesigner中创建新的报表。该FlexReport向导引导您完成创建从开始到结束的一份新报表的步骤。首先,请完成以下步骤:
- 从关于FlexReportDesigner中讨论的位置运行C1FlexReportDesigner.exe文件。
- 转到菜单栏中的“ 文件菜单”,然后选择“ 新建命令”。
FlexReportdesigner中出现空白以创建新报表。 - 在设计器最左侧的“ 报表”选项卡中,单击“ 新报表”下拉菜单,然后选择“报表向导”。
会打开FlexReport向导窗口。
在C1FlexReport向导中,完成以下五个步骤来创建报表:
选择新报表的数据源。
使用此页面选择将用于检索报表数据的DataSource.ConnectionString和DataSource.RecordSource。
您可以通过三种方式指定DataSource.ConnectionString:
- 直接在编辑器中输入字符串。
- 使用下拉列表选择最近使用的连接字符串(设计器保留最近八个连接字符串的记录)。
- 单击省略号按钮(...)以显示标准连接字符串构建器。
您可以通过两种方式指定DataSource.RecordSource字符串:
- 单击“ 数据源 ”选项,然后从列表中选择一个表格。
- 单击“ SQL”选项,然后在编辑器中键入(或粘贴)SQL语句。
完成步骤1:
完成以下步骤:
- 单击省略号按钮以显示标准连接字符串构建器。将打开“ 数据链接属性”对话框。
- 选择提供程序选项卡,然后从列表中选择一个数据提供程序。对于此示例,选择Microsoft Jet 4.0 OLE DB提供程序。
- 单击下一步按钮或选择连接选项卡。现在,您必须选择一个数据源。
- 单击省略号按钮以选择一个数据库。出现“ 选择访问数据库”对话框。对于此示例,选择ComponentOne Samples目录(默认情况下安装在电脑的“文档”文件夹中)的Common文件夹中的C1NWind.mdb。请注意,此目录反映了默认安装路径,如果您更改了安装路径,则该路径可能会有所不同。
- 点击打开。您可以测试连接,然后单击“ 确定”。
- 单击“ 确定”关闭“ 数据链接属性”对话框。
- 选择数据源后,可以选择一个表,视图或存储过程来提供实际数据。您可以通过两种方式指定DataSource.RecordSource字符串:
- 选择“ 数据源”选项卡,然后从“ 表格”列表中选择“ Products ” 表。
- 选择“ SQL”选项卡,然后在编辑器中键入(或粘贴)SQL语句。
例如:
select * from products
- 单击下一步。该向导将引导您完成其余步骤。
选择要包括在报表中的字段。
此页面包含您在步骤1中选择的记录集中可用字段的列表,以及两个定义报表组和详细信息字段的列表。组字段定义如何对数据进行排序和汇总,明细字段定义要在报表中显示的信息。
您可以使用鼠标指针将字段从一个列表移动到另一个列表。将字段拖到“ 详细信息”列表中以将其包括在报表中,或在列表中拖移以更改其顺序。将字段拖回到“ 可用”列表中,以将其从报表中删除。
完成步骤2:
完成以下步骤:
- 用鼠标指针选择CategoryID字段并将其拖到“ 分组”列表中。
- 按>>按钮将其余字段移到“ 详细”列表中。
- 单击下一步。该向导将引导您完成其余步骤。
选择新报表的布局。
该页面为您提供了几个选项,以定义如何在页面上组织数据。选择布局时,缩略图预览会显示在左侧,以使您大致了解页面上的布局。布局分为两组,一组用于没有组的报表,另一组用于有组的报表。选择最适合最终报表外观的布局。
该页面还允许您选择页面方向以及是否应调整字段以适合页面宽度。
该标签布局选项是用来打印艾利风格的标签。如果选择此选项,则会看到一个页面,提示您输入要打印的标签类型。
完成步骤3:
完成以下步骤:
- 保持大纲布局。
- 单击下一步。该向导将引导您完成其余步骤。
- 保持大纲布局。
选择新报表的样式。
该页面允许您选择将在新报表中使用的字体和颜色。像上一页一样,它显示了预览,可让您大致了解每种样式。选择最喜欢的一个(请记住,您可以对其进行优化并在以后调整细节)。
完成步骤4:
选择Verdana样式。
单击下一步。该向导将引导您完成其余步骤。
选择新报表的标题。
最后一页使您可以为新报表选择标题,并决定是要立即预览新报表还是要进入编辑模式并开始改进设计,然后再预览。
完成步骤5:
- 输入新报表的标题,例如Products Report。
选择预览报表,然后单击完成。
您将立即在Designer的预览窗格中看到该报表。
- 输入新报表的标题,例如Products Report。
您会注意到该报表将需要进行一些调整。
您也可以从Visual Studio 调用C1FlexReportDesigner。为此,请完成以下步骤:
- 创建一个.NET项目,然后将C1FlexReport组件添加到“工具箱”中。
- 在工具箱中,双击C1FlexReport图标,将组件添加到您的项目中。请注意,该组件将出现在“组件托盘”中的表单下方。
- 单击C1FlexReport组件的智能标记,然后从其“ 任务”菜单中选择“ 编辑报表”。 该C1FlexReportDesigner打开,C1FlexReport向导准备指导您完成上面所讨论的五个简单的步骤。
使用代码创建报表定义:
以下步骤显示了如何使用FlexReportDesigner应用程序或代码创建报表定义。您甚至可以编写自己的报表设计器或临时报表生成器。
该示例使用代码基于C1NWind数据库创建简单的表格报表定义。该代码已注释,并说明了C1FlexReport对象模型的最重要元素。完成以下步骤:
- 首先,将一个按钮控件,C1FlexReport组件和FlexViewer控件添加到表单中。设置以下属性:
Button.Name = btnEmployees
C1FlexReport.Name = c1FlexReport1(C#中的默认名称)
C1FlexViewer.Name = c1FlexViewer1(C#中的默认名称)
- 使用Clear方法初始化名为c1FlexReport1的控件,以清除其内容并设置控件字体(这是将分配给新字段的字体):
私有 void RenderEmployees() { c1FlexReport1.DataSource.RecordSourceType = RecordSourceType.Auto; //清除所有现有字段 c1FlexReport1.Clear(); //为所有控件设置默认字体 c1FlexReport1.Font.Name = “ Tahoma” ; c1FlexReport1.Font.Size = 8; }
接下来,设置DataSource对象以从C1NWind.mdb数据库检索所需的数据。这是使用ConnectionString和RecordSource属性完成的:
//初始化DataSource DataSource ds = c1FlexReport1.DataSource; ds.ConnectionString = @“ Provider = Microsoft.Jet.OLEDB.4.0;数据源= C:\ ... \ ComponentOne Samples \ Common \ C1NWind.mdb;” ; ds.RecordSource = “员工” ;
接下来,初始化Layout对象,该对象定义如何在页面上布置报表。在这种情况下,以“纵向”模式呈现报表并将其“ 宽度”设置为6.5英寸(8.5页宽度减去一英寸的空白边距):
//初始化布局 布局l = c1FlexReport1.Layout; l.Orientation = OrientationEnum.Portrait; l.Width = 6.5 * 1440; // 8.5-边距,以缇为单位
现在介绍有趣的部分。每个报表都有五个基本部分:详细信息,报表标题,报表页脚,页面页眉和页面页脚。使用以下代码通过设置几个属性并向其添加标题字段来设置报表标题:
//创建报表标题 Section s = c1FlexReport1.Sections [SectionTypeEnum.Header]; 高度= 1440; s.Visible = true; s.BackColor = Color.FromArgb(200,200,200); TextField textFld1 = new TextField(); textFld1.Name = “ FldTitle” ; textFld1.Text = “员工报表” ; textFld1.Left = 0; textFld1.Top = 0; textFld1.Width = 8000; textFld1.Height = 1440; textFld1.Font.Size = 24; textFld1.Font.Bold = true ; textFld1.ForeColor = Color.FromArgb(0,0,100); c1FlexReport1.Sections.Header.Fields.Add(textFld1);
该节对象具有Fields集合。集合的Add方法创建一个新字段并将其分配给Section。参数指定新字段的“名称”,“文本”,“左”,“顶部”,“宽度”和“高度”属性。默认情况下,该字段具有与控件相同的字体。由于这是标题,因此更改字体并使之变大是有意义的。请注意,该字段应该足够高以容纳字体大小,否则将不显示任何内容。
接下来,设置页面页脚部分。此部分更有趣,因为它在文本字段中包含表达式。要评估文本字段中的表达式,只需在TextField.Text.Expression属性中设置表达式。呈现报表时,将评估文本字段中的表达式。在C1Report中,通过将字段的Calculated属性设置为True可以实现相同目的。要创建页脚,请添加以下代码:
//创建页面页脚 s = c1FlexReport1.Sections [SectionTypeEnum.PageFooter]; 高度= 500; s.Visible = true; TextField textFld2 = new TextField(); textFld2.Name = “ FldFtrLeft” ; textFld2.Text.Expression = @ “” “员工:在 ”&Now“ 上打印; textFld2.Left = 0; textFld2.Top = 0; textFld2.Width = 4000; textFld2.Height = 300; textFld2.Font.Size = 8; textFld2.Font.Bold = false ; c1FlexReport1.Sections.PageFooter.Fields.Add(textFld2); TextField textFld3 = new TextField(); textFld3.Name = “ FldFtrRight” ; textFld3.Text.Expression = @ “” “页面” “ +页面+” “的 &页面” ; textFld3.Left = 4000; textFld3.Top = 0; textFld3.Width = 4000; textFld3.Height = 300; textFld3.Align = FieldAlignEnum.RightTop; textFld3.Width = c1FlexReport1.Layout.Width-textFld3.Left; c1FlexReport1.Sections.PageFooter.Fields.Add(textFld3); //在页面页脚 ShapeField shpfld = new ShapeField()之前添加一行 shpfld.Name = “ FldLine” ; shpfld.ShapeType = ShapeType.Line; shpfld.Left = 0; shpfld.Top = 0; shpfld.Width = c1FlexReport1.Layout.Width; shpfld.Height = 20; c1FlexReport1.Sections.PageFooter.Fields.Add(shpfld);
页面页脚部分使用的表达式的变量不是VBScript固有的,而是由C1FlexReport定义的。Page和Pages是包含当前页码和总页数的变量。本节还使用配置为看起来像线的字段。
接下来,设置页面标题部分。此部分显示在每个页面的顶部,并将显示字段标签。在表格报表中,使用“页眉”部分显示字段标签是一种常见的技术。该代码很简单,但由于进行了所有现场测量,因此看起来有些混乱。在实际应用中,这些值不会硬连接到程序中。要创建带有字段标签的页面标题,请添加以下代码:
//创建带有字段标签 s = c1FlexReport1.Sections [SectionTypeEnum.PageHeader]; 的页面标题 高度= 500; s.Visible = true; c1FlexReport1.Font.Bold = true ; TextField textFld4 = new TextField(); textFld4.Name = “ LblID” ; textFld4.Text = “ ID” ; textFld4.Left = 0; textFld4.Top = 50; textFld4.Width = 400; textFld4.Height = 300; textFld4.Align = FieldAlignEnum.RightTop; c1FlexReport1.Sections.PageHeader.Fields.Add(textFld4); TextField textFld5 = new TextField(); textFld5.Name = “ LblFirstName” ; textFld5.Text = “第一” ; textFld5.Left = 500; textFld5.Top = 50; textFld5.Width = 900; textFld5.Height = 300; c1FlexReport1.Sections.PageHeader.Fields.Add(textFld5); TextField textFld6 = new TextField(); textFld6.Name = “ LblLastName” ; textFld6.Text = “最后” ; textFld6.Left = 1500; textFld6.Top = 50; textFld6.Width = 900; textFld6.Height = 300; c1FlexReport1.Sections.PageHeader.Fields.Add(textFld6); TextField textFld7 = new TextField(); textFld7.Name = “ LblTitle” ; textFld7.Text = “标题” ; textFld7.Left = 2500; textFld7.Top = 50; textFld7.Width = 2400; textFld7.Height = 300; c1FlexReport1.Sections.PageHeader.Fields.Add(textFld7); TextField textFld8 = new TextField(); textFld8.Name = “ LblTitle” ; textFld8.Text = “注释” ; textFld8.Left = 5000; textFld8.Top = 50; textFld8.Width = 8000; textFld8.Height = 300; c1FlexReport1.Sections.PageHeader.Fields.Add(textFld8); c1FlexReport1.Font.Bold = false ; ShapeField shpfld2 = new ShapeField(); shpfld2.Name = “ FldLine” ; shpfld2.ShapeType = ShapeType.Line; shpfld2.Left = 0; shpfld2.Top = 400; shpfld2.Width = c1FlexReport1.Layout.Width; shpfld2.Height = 20; c1FlexReport1.Sections.PageHeader.Fields.Add(shpfld2);
此代码说明了一种用于处理字体的强大技术。由于每个字段在创建时都会继承控件字体,因此在创建字段之前将控件的Font.Bold属性设置为True,然后再将其设置为False。因此,“页眉”部分中的所有控件均具有粗体。
要完成报表,请添加“详细信息”部分。这是显示实际数据的部分。它在页面标题部分中每个标签下方的文本字段中包含表达式。要创建Detail部分,请添加以下代码:
//创建详细信息部分 s = c1FlexReport1.Sections [SectionTypeEnum.Detail]; 高度= 330; s.Visible = true; TextField textField = new TextField(); textField.Name = “ FldID” ; textField.Text.Expression = “ EmployeeID” ; textField.Left = 0; textField.Top = 0; textField.Width = 400; textField.Height = 300; c1FlexReport1.Sections.Detail.Fields.Add(textField); TextField textField1 = new TextField(); textField1.Name = “ FldFirstName” ; textField1.Text.Expression = “名字” ; textField1.Left = 500; textField1.Top = 0; textField1.Width = 900; textField1.Height = 300; c1FlexReport1.Sections.Detail.Fields.Add(textField1); TextField textField2 = new TextField(); textField2.Name = “ FldLastName” ; textField2.Text.Expression = “姓氏”; textField2.Left = 1500; textField2.Top = 0; textField2.Width = 900; textField2.Height = 300; c1FlexReport1.Sections.Detail.Fields.Add(textField2); TextField textField3 = new TextField(); textField3.Name = “ FldTitle” ; textField3.Text.Expression = “标题” ; textField3.Left = 2500; textField3.Top = 0; textField3.Width = 2400; textField3.Height = 300; c1FlexReport1.Sections.Detail.Fields.Add(textField3); TextField textField4 = new TextField(); textField4.Name = “ FldNotes” ; textField4.Text.Expression = “注释” ; textField4.Left = 5000; textField4.Top = 0; textField4.Width = 8000; textField4.Height = 300; c1FlexReport1.Sections.Detail.Fields.Add(textField4); textField4.Width = c1FlexReport1.Layout.Width-textField4.Left; textField4.AutoHeight = AutoSizeBehavior.CanGrow; textField4.Font.Size = 6; textField4.Align = FieldAlignEnum.JustTop; //在详细信息部分的每个字段之后添加一行 ShapeField shpfld3 = new ShapeField(); shpfld3.Name = “ FldLine” ; shpfld3.ShapeType = ShapeType.Line; shpfld3.Left = 0; shpfld3.Top = 310; shpfld3.Width = c1FlexReport1.Layout.Width; shpfld3.Height = 20; c1FlexReport1.Sections.Detail.Fields.Add(shpfld3);
请注意,所有文本字段都包含表达式,并且每个文本字段都与源记录源中的字段名称相对应。在TextField.Text.Expression属性中设置表达式可确保将Text属性解释为数据库字段名称,而不是按字面呈现。重要的是为报表字段采用一种命名约定,使它们与记录集字段名称不同,从而使其唯一。如果您有两个名为“ LastName”的字段,则诸如“ Left(LastName,1)”的表达式将是不明确的。本示例采用了以“ Fld”开头所有报表字段名称的约定。
请注意,“ FldNotes”字段的AutoHeight属性设置为CanGrow,并且字体比其他字体小。这样做是为了确保数据库中包含大量文本的“注释”字段将出现在报表中。将AutoHeight属性设置为CanGrow可以使控件根据需要扩展字段以适合其内容,而不是使字段变得很高且浪费空间。还将包含节的AutoHeight属性设置为True,因此该字段不会溢出该节。
报表定义完成。要将报表呈现到FlexViewer控件中,请双击“ 雇员”按钮以为btnEmployees_Click事件添加事件处理程序。将打开代码编辑器,并将插入点放置在事件处理程序中。输入以下代码:
RenderEmployees(); c1FlexViewer1.DocumentSource = c1FlexReport1;
基本报表如下所示: