演练:创建 ReportViewer 报表

本演练演示如何在 Microsoft Visual Studio 2008 Windows 应用程序项目中基于 AdventureWorks 示例数据库创建简单的表报表。您将执行以下操作:向项目添加报表模板、为 AdventureWorks 数据库设置连接信息、定义查询、添加表数据区域以及向 Windows 窗体添加 ReportViewer Windows 窗体控件,以使应用程序的用户可以查看报表。

系统必备

若要使用本演练,您必须有权访问 SQL Server 2005 的 AdventureWorks 示例数据库。如果使用 AdventureWorks 的早期版本,查询将失败。有关如何获取 AdventureWorks 的 SQL Server 2005 版本的更多信息,请参见演练:安装 AdventureWorks 数据库

本演练假定您已经熟悉 Transaction-SQL 查询以及 ADO.NET DataSetDataTable 对象。

创建新的基于 Windows 的应用程序项目

  1. 打开 Visual Studio。在**“文件”菜单上,指向“新建”,然后选择“项目”**。

  2. 在“项目类型”窗格中,选择 Visual Basic

  3. 在“模板”窗格中,选择**“Windows 应用程序”**以创建基于 Microsoft Windows 的应用程序。

  4. 在**“名称”框中,键入“SimpleReport”**。

  5. 在**“位置”框中,输入要保存项目的目录,或者单击“浏览”**以导航到该目录。

    随即会打开 Windows 窗体设计器,其中将显示所创建的项目的**“Form1”**。

  6. 单击该窗体。从**“视图”菜单中选择“属性窗口”。展开“大小”属性,以显示“宽度”“高度”。将“宽度”**设置为 500 像素。

定义数据源连接和数据表

  1. 在解决方案资源管理器中,右击名为**“SimpleReport”的项目(并非解决方案),指向“添加”,然后选择“新建项”。如果“解决方案资源管理器”窗口不可见,请在“视图”菜单中单击“解决方案资源管理器”**。

  2. 在**“添加新项”对话框中,单击“数据集”。为数据集键入名称,然后单击“添加”。默认名称为“DataSet1.xsd”**。

    这会向项目中添加一个新的 XSD 文件并打开数据集设计器。

  3. 在**“视图”菜单中单击“设计器”。打开工具箱,然后将“TableAdapter”**控件拖动到“数据集”设计图面上。

    这将启动**“TableAdapter 配置向导”**。

  4. 在**“选择您的数据连接”页中,单击“新建连接”**。

  5. 在**“添加连接”**页上,请执行下列步骤:

    • 在**“数据源”框中,选择“Microsoft SQL Server”**。

    • 在**“服务器名称”**框中,输入 AdventureWorks 数据库所在的服务器。

      默认的 SQL Server Express 实例为**“(local)\sqlexpress”**。

    • 在下拉列表中,单击**“AdventureWorks”**。

    • 单击**“确定”继续返回到向导,再单击“下一步”**。

  6. 在**“将连接字符串保存到应用程序配置文件中”页上,为连接字符串键入名称或接受默认的“AdventureWorksConnectionString”。单击“下一步”**。

  7. 在**“选择命令类型”页上,选择“使用 SQL 语句”,然后单击“下一步”**。

  8. 在**“输入 SQL 语句”页上,输入以下 Transact-SQL 查询以便从 AdventureWorks 数据库中检索销售数据,然后单击“完成”**:

    SELECT  S.OrderDate, S.SalesOrderNumber, S.TotalDue AS TotalSales, 
            C.FirstName, C.LastName
    FROM    HumanResources.Employee E INNER JOIN
            Person.Contact C ON E.ContactID = C.ContactID INNER JOIN
            Sales.SalesOrderHeader S ON E.EmployeeID = S.SalesPersonID
    

    此外还可以单击**“查询生成器”按钮,然后使用查询生成器创建查询并使用“执行查询”**按钮加以验证。

    现在,数据集设计器将显示**“DataTable1”DataTable 定义,其中各个字段均以查询的列和列别名命名(“OrderDate”“SalesOrderNumber”“TotalSales”“FirstName”“LastName”**)。在将数据绑定到报表数据区域时,将在“数据源”窗口中用到这些字段。

    Note注意

    如果需要更改数据表中的字段,请右击数据集设计器页上的“DataTable1”标题或“DataTable1TableAdapter”标题。选择“配置”,这将重新启动“TableAdapter 配置向导”

添加新报表定义文件

  1. 在**“项目”菜单中,指向“添加新项”**。

  2. 在**“添加新项”对话框中,单击“报表”**。

  3. 在**“名称”中,键入“Sales Orders.rdlc”,然后单击“添加”**打开图形设计图面。

    图形设计图面是 Visual Studio 2008 中报表设计器组件的一部分。

向报表布局中添加表

  1. 将**“Sales Orders.rdlc”置于图形设计模式下,然后在“视图”**菜单中选择“工具箱”。

    随即将打开工具箱。

  2. 在工具箱的**“数据”**部分中,单击“表”,然后单击报表设计图面。

    报表设计器将显示一个表,此表包含三列,横跨报表的整个宽度。

  3. 单击该表,以便在表的上方和旁边显示列句柄和行句柄。

  4. 在第一列上,右击句柄,然后单击**“在左侧插入列”**。

  5. 从**“table1”的“属性”窗口中,展开“大小”节点。默认情况下,“属性”窗口停靠在解决方案资源管理器下方。通过在“视图”**菜单中选择“属性窗口”,也可以打开此窗口。

  6. 将**“大小”节点的“宽度”属性设置为“4.8 英寸”**。这会将表宽和列宽设置为在窗体中进行查看时所需的空间。

  7. 在报表设计器中,单击设计图面。

  8. 在“属性”窗口中,展开**“大小”节点并将“宽度”设置为“5 英寸”**。

  9. 在“数据源”窗口中,单击“DataTable1”节点,以将其展开并显示各个数据字段。接下来,请执行下列步骤:

    • 将**“数据源”窗口中的“LastName”**字段拖动到表中第一列的中间(详细信息)行内。

    • 将字段拖至中间单元时,会发生两件事。

      首先,详细信息单元格将包含以下文本:“=Fields!LastName.Value”。此文本是一个字段表达式,用于为**“LastName”字段指定数据值。添加到“详细信息”**行的字段始终被指定为表达式。

      其次,列标题值自动放置在紧邻字段表达式上面的第一行。默认情况下,该列是根据相应的字段名称生成的。如果字段名称使用 Pascal 大小写格式,列名中的每个单词都将变为首字母大写,且单词之间用空格分隔。例如**“LastName”将变为“Last Name”**。

    • 将“数据源”窗口中的**“OrderDate”**字段拖动到表中第二列的中间(详细信息)行内。

    • 将“数据源”窗口中的**“SalesOrderNumber”**字段拖动到表中第三列的中间(详细信息)行内。

    • 将“数据源”窗口中的**“TotalSales”**字段拖动到表中最后一列的中间(详细信息)行内。

    下图显示了已使用下列字段填充的表数据区域:“LastName”“OrderDate”“SalesOrderNumber”“TotalSales”

    默认报表定义表

向窗体中添加 ReportViewer 控件

  1. 在解决方案资源管理器中单击**“Form1.vb”**。

  2. 从**“视图”菜单中选择“设计器”**。

  3. 在工具箱的**“数据”**部分中,将 ReportViewer 控件拖动到窗体上。

  4. 在该窗体中单击鼠标。在“属性”窗口中,展开**“大小”**。根据需要设置宽度和高度属性。

  5. 通过单击 ReportViewer 控件右上角的三角形,打开该控件的智能标记面板。单击**“选择报表”下拉列表,然后选择“Sales Orders.rdlc”**。

  6. 在智能标记面板中,单击**“在父容器中停靠”**。

    在本演练的剩余部分中,您可以随时生成应用程序并在窗体中查看报表。如果要查看报表设计的每次更改对最终报表的影响,可以在执行下面每个过程的最后一个步骤时都生成并查看报表。

  7. (可选)按 F5 生成应用程序并在窗体中查看报表。

    下图显示了当前在窗体中呈现的报表定义。您将看到一个标题行,数据表中的每一行都有一个详细信息行,报表的最后一页上显示一个页脚行,所有这些行都采用默认格式。

    已呈现报表中的默认表

设置数据字段的格式

  1. 右击**“OrderDate”字段表达式所在的单元格,然后单击“属性”。将显示“文本框属性”**对话框。

  2. 选择**“格式”选项卡,然后单击浏览(“…”)按钮打开“选择格式”**对话框。

    在**“格式”框中,选择“标准”,再选择“日期”**,然后选择一种日期格式。

  3. 单击**“确定”关闭“选择格式”对话框,然后再次单击“确定”关闭“文本框属性”**对话框。

    “选择日期格式”对话框

  4. (可选)按 F5 生成应用程序并查看报表。在本示例中,您将看到日期列已具有您刚才应用的格式。

设置货币字段的格式

  1. 右击 TotalSales 字段表达式所在的单元格,然后单击**“属性”**。

  2. 选择**“格式”选项卡,然后单击浏览(“…”)按钮打开“选择格式”**对话框。

  3. 在**“格式”框中,选择“标准”,再选择“货币”**,然后选择一种货币格式。

  4. 单击**“确定”,然后再次单击“确定”关闭“文本框属性”**对话框。

    “选择货币格式”对话框

  5. (可选)按 F5 生成应用程序并查看报表。在本示例中,您将看到**“Total Sales”**列值已显示为货币格式。

设置表格表头的格式

  1. 单击该表,以便在表的上方和旁边显示列句柄和行句柄。

    Note注意

    句柄是显示在表的上方和旁边的灰框。您可以使用句柄对列、行和表本身执行各种操作。穿过表顶部上下拉伸的句柄是列句柄。沿着表一侧拉伸的句柄是行句柄。列句柄和行句柄的交汇处是角部句柄。若要查看表句柄的示例,请参见添加表数据区域(Visual Studio 报表设计器)

  2. 选择第一行(包含列标题标签)的行句柄,然后单击**“加粗”**。

  3. 单击表的标题行,然后单击**“背景色”。单击“Web”选项卡,然后选择“粉红玫瑰”。单击“确定”**。

  4. (可选)单击 F5 生成应用程序并查看报表。下图显示了设置了格式的报表。

    格式化的默认表视图

为表格格式报表定义组

  1. 单击该表,以便在表的上方和旁边显示列句柄和行句柄。

  2. 右击任何行的句柄,再单击**“插入组”**。

  3. 在**“常规”选项卡上的“分组方式”框中,在第一行选择 =Fields!LastName.Value,在第二行选择 =Fields!FirstName.Value。这会按销售人员的姓名对数据分组。请注意,您可以按照表数据区域中未使用但出现在“DataTable1”**字段中的字段对数据分组。

    “常规”选项卡,“分组和排序属性”页

  4. 单击**“确定”**。

    随即将向表中添加组头和组尾。

按组汇总数据

  1. 单击组的标题行,然后单击**“背景色”。选择“Web”选项卡,然后选择“浅青色”。单击“确定”**。

  2. 将每行中重复的**“TotalSales”**替换为组头中汇总组数据的表达式。

    1. 右击**“Total Sales”的组头,然后选择“属性”。随即将打开“文本框属性”**对话框。

    2. 复制下面的文本并将其粘贴到**“值”**下拉列表中。

      =Sum(Fields!TotalSales.Value)
      
    3. 向此文本框应用货币格式。

  3. 将每行中重复的名称替换为组头中包含两行内容的表达式。第一行是名字和姓氏。第二行是非空的销售量。

    1. 选择**“Last Name”**详细信息行中的表达式,然后将其删除。

    2. 右击“Last Name”的组标题行,然后选择**“表达式”。复制下面的文本并将其粘贴在“编辑表达式”**对话框区域中。

      Fields!FirstName.Value + " " + Fields!LastName.Value + ": " + vbCrLf + Count(Fields!SalesOrderNumber.Value).ToString()
      

    下图显示了执行此步骤后的表达式编辑器。

    组文本框的“编辑表达式”对话

  4. (可选)按 F5 生成应用程序并查看报表。下图显示了按每个销售人员的姓名分组后的表行。每个组头汇总相应组的详细信息行,其中显示销售人员的姓名、销售量和总销售额。

    已处理报表中表组的视图

对表格格式报表中的组进行排序

  1. 选择表数据区域并打开**“表属性”**。

  2. 单击**“组”选项卡。将自动选择唯一定义的组“table1_Group1”。单击“编辑”。随即将打开“分组和排序”**对话框。

    验证打开的对话框是**“分组和排序属性”而非“表属性”“表属性排序”**选项卡控制的是详细信息行的排序方式,而非组的排序方式。在下一过程中,您将设置详细信息行的排序。

  3. 单击**“排序”选项卡。在“排序方式”框中的下拉列表中,选择“<表达式...>”。在“编辑表达式”**框中,键入要用作排序依据的表达式。例如:

    =Count(Fields!SalesOrderNumber.Value)

  4. 单击**“确定”**。

    “分组和排序”对话框

  5. (可选)按 F5 生成应用程序并查看报表。现在,您的报表已按每个销售人员的销售量排序。

    排序后表组的视图

在表格格式报表中对组内的详细信息行进行排序

  1. 单击该表,以便在表的上方和旁边显示列句柄和行句柄。

  2. 右击角部句柄,再单击**“属性”按钮。随即将打开“表属性”**对话框。

    Note注意

    角部句柄是指列句柄和行句柄交汇处的句柄。

  3. 在**“排序”选项卡上的“排序方式”框中,选择“=Fields!TotalSold.Value”。在“方向”框中,选择“降序”**。这将按销售额对明细数据排序,并在第一行显示最大的值。

  4. 单击**“确定”**。

    “表属性”对话框的外观应类似于下图。

    “表属性”对话,“排序”选项卡

  5. (可选)按 F5 生成应用程序并查看报表。下图显示了所得报表的第 2 页,以演示具有多个详细信息行的组。

    按详细信息行排序的已分组报表数据的视图

在表格格式报表的页脚中添加汇总数据

  1. 在表尾行中,选择“Sales Order”和“Total Sales”单元格。在选定的单元格中单击右键,然后选择**“合并单元格”**。

    这将提供更多的空间来设置表中销售总和的格式。

  2. 在合并后的单个单元格中单击右键,然后选择**“属性”**。

  3. 在**“值”**下拉列表中,键入以下表达式:

    =Sum(Fields!TotalSales.Value)

  4. 向合并后的单元格应用货币格式。

  5. 在合并单元格旁边的文本框单元格中单击鼠标,然后创建一个标签。例如,键入**“Total Sold:”**。请注意,这完全是文本,而非表达式。

  6. (可选)设置页脚行的背景色,使之与标题行的背景色匹配。

    下图显示了表定义。

    具有表尾的报表定义表

  7. (可选)按 F5 生成应用程序并查看报表。在呈现的报表中,单击报表工具栏上的**“最后一页”**按钮,以导航至报表的最后一页。滚动到底部,您将看到总销售额。

    具有表尾结果的表视图

另请参见

参考

Microsoft.Reporting.WinForms.ReportViewer.Drillthrough
Microsoft.Reporting.WinForms.LocalReport.SubreportProcessing
Microsoft.Reporting.WebForms.ReportViewer.Drillthrough
Microsoft.Reporting.WebForms.LocalReport.SubreportProcessing

概念

使用“ReportViewer 任务”智能标记面板

其他资源

示例和演练