本演练演示如何在 Microsoft Visual Studio 2008 Windows 应用程序项目中基于 AdventureWorks 示例数据库创建简单的表报表。您将执行以下操作:向项目添加报表模板、为 AdventureWorks 数据库设置连接信息、定义查询、添加表数据区域以及向 Windows 窗体添加 ReportViewer Windows 窗体控件,以使应用程序的用户可以查看报表。
系统必备
若要使用本演练,您必须有权访问 SQL Server 2005 的 AdventureWorks 示例数据库。如果使用 AdventureWorks 的早期版本,查询将失败。有关如何获取 AdventureWorks 的 SQL Server 2005 版本的更多信息,请参见演练:安装 AdventureWorks 数据库。
本演练假定您已经熟悉 Transaction-SQL 查询以及 ADO.NET DataSet 和 DataTable 对象。
创建新的基于 Windows 的应用程序项目
- 打开 Visual Studio。在**“文件”菜单上,指向“新建”,然后选择“项目”**。 
- 在“项目类型”窗格中,选择 Visual Basic。 
- 在“模板”窗格中,选择**“Windows 应用程序”**以创建基于 Microsoft Windows 的应用程序。 
- 在**“名称”框中,键入“SimpleReport”**。 
- 在**“位置”框中,输入要保存项目的目录,或者单击“浏览”**以导航到该目录。 - 随即会打开 Windows 窗体设计器,其中将显示所创建的项目的**“Form1”**。 
- 单击该窗体。从**“视图”菜单中选择“属性窗口”。展开“大小”属性,以显示“宽度”和“高度”。将“宽度”**设置为 500 像素。 
定义数据源连接和数据表
- 在解决方案资源管理器中,右击名为**“SimpleReport”的项目(并非解决方案),指向“添加”,然后选择“新建项”。如果“解决方案资源管理器”窗口不可见,请在“视图”菜单中单击“解决方案资源管理器”**。 
- 在**“添加新项”对话框中,单击“数据集”。为数据集键入名称,然后单击“添加”。默认名称为“DataSet1.xsd”**。 - 这会向项目中添加一个新的 XSD 文件并打开数据集设计器。 
- 在**“视图”菜单中单击“设计器”。打开工具箱,然后将“TableAdapter”**控件拖动到“数据集”设计图面上。 - 这将启动**“TableAdapter 配置向导”**。 
- 在**“选择您的数据连接”页中,单击“新建连接”**。 
- 在**“添加连接”**页上,请执行下列步骤: - 在**“数据源”框中,选择“Microsoft SQL Server”**。 
- 在**“服务器名称”**框中,输入 AdventureWorks 数据库所在的服务器。 - 默认的 SQL Server Express 实例为**“(local)\sqlexpress”**。 
- 在下拉列表中,单击**“AdventureWorks”**。 
- 单击**“确定”继续返回到向导,再单击“下一步”**。 
 
- 在**“将连接字符串保存到应用程序配置文件中”页上,为连接字符串键入名称或接受默认的“AdventureWorksConnectionString”。单击“下一步”**。 
- 在**“选择命令类型”页上,选择“使用 SQL 语句”,然后单击“下一步”**。 
- 在**“输入 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”**)。在将数据绑定到报表数据区域时,将在“数据源”窗口中用到这些字段。 .gif) 注意 注意- 如果需要更改数据表中的字段,请右击数据集设计器页上的“DataTable1”标题或“DataTable1TableAdapter”标题。选择“配置”,这将重新启动“TableAdapter 配置向导”。 
添加新报表定义文件
- 在**“项目”菜单中,指向“添加新项”**。 
- 在**“添加新项”对话框中,单击“报表”**。 
- 在**“名称”中,键入“Sales Orders.rdlc”,然后单击“添加”**打开图形设计图面。 - 图形设计图面是 Visual Studio 2008 中报表设计器组件的一部分。 
向报表布局中添加表
- 将**“Sales Orders.rdlc”置于图形设计模式下,然后在“视图”**菜单中选择“工具箱”。 - 随即将打开工具箱。 
- 在工具箱的**“数据”**部分中,单击“表”,然后单击报表设计图面。 - 报表设计器将显示一个表,此表包含三列,横跨报表的整个宽度。 
- 单击该表,以便在表的上方和旁边显示列句柄和行句柄。 
- 在第一列上,右击句柄,然后单击**“在左侧插入列”**。 
- 从**“table1”的“属性”窗口中,展开“大小”节点。默认情况下,“属性”窗口停靠在解决方案资源管理器下方。通过在“视图”**菜单中选择“属性窗口”,也可以打开此窗口。 
- 将**“大小”节点的“宽度”属性设置为“4.8 英寸”**。这会将表宽和列宽设置为在窗体中进行查看时所需的空间。 
- 在报表设计器中,单击设计图面。 
- 在“属性”窗口中,展开**“大小”节点并将“宽度”设置为“5 英寸”**。 
- 在“数据源”窗口中,单击“DataTable1”节点,以将其展开并显示各个数据字段。接下来,请执行下列步骤: - 将**“数据源”窗口中的“LastName”**字段拖动到表中第一列的中间(详细信息)行内。 
- 将字段拖至中间单元时,会发生两件事。 - 首先,详细信息单元格将包含以下文本:“=Fields!LastName.Value”。此文本是一个字段表达式,用于为**“LastName”字段指定数据值。添加到“详细信息”**行的字段始终被指定为表达式。 - 其次,列标题值自动放置在紧邻字段表达式上面的第一行。默认情况下,该列是根据相应的字段名称生成的。如果字段名称使用 Pascal 大小写格式,列名中的每个单词都将变为首字母大写,且单词之间用空格分隔。例如**“LastName”将变为“Last Name”**。 
- 将“数据源”窗口中的**“OrderDate”**字段拖动到表中第二列的中间(详细信息)行内。 
- 将“数据源”窗口中的**“SalesOrderNumber”**字段拖动到表中第三列的中间(详细信息)行内。 
- 将“数据源”窗口中的**“TotalSales”**字段拖动到表中最后一列的中间(详细信息)行内。 
 - 下图显示了已使用下列字段填充的表数据区域:“LastName”、“OrderDate”、“SalesOrderNumber”和“TotalSales”。 .gif) 
向窗体中添加 ReportViewer 控件
- 在解决方案资源管理器中单击**“Form1.vb”**。 
- 从**“视图”菜单中选择“设计器”**。 
- 在工具箱的**“数据”**部分中,将 ReportViewer 控件拖动到窗体上。 
- 在该窗体中单击鼠标。在“属性”窗口中,展开**“大小”**。根据需要设置宽度和高度属性。 
- 通过单击 ReportViewer 控件右上角的三角形,打开该控件的智能标记面板。单击**“选择报表”下拉列表,然后选择“Sales Orders.rdlc”**。 
- 在智能标记面板中,单击**“在父容器中停靠”**。 - 在本演练的剩余部分中,您可以随时生成应用程序并在窗体中查看报表。如果要查看报表设计的每次更改对最终报表的影响,可以在执行下面每个过程的最后一个步骤时都生成并查看报表。 
- (可选)按 F5 生成应用程序并在窗体中查看报表。 - 下图显示了当前在窗体中呈现的报表定义。您将看到一个标题行,数据表中的每一行都有一个详细信息行,报表的最后一页上显示一个页脚行,所有这些行都采用默认格式。 .gif) 
设置数据字段的格式
- 右击**“OrderDate”字段表达式所在的单元格,然后单击“属性”。将显示“文本框属性”**对话框。 
- 选择**“格式”选项卡,然后单击浏览(“…”)按钮打开“选择格式”**对话框。 - 在**“格式”框中,选择“标准”,再选择“日期”**,然后选择一种日期格式。 
- 单击**“确定”关闭“选择格式”对话框,然后再次单击“确定”关闭“文本框属性”**对话框。 .gif) 
- (可选)按 F5 生成应用程序并查看报表。在本示例中,您将看到日期列已具有您刚才应用的格式。 
设置货币字段的格式
- 右击 TotalSales 字段表达式所在的单元格,然后单击**“属性”**。 
- 选择**“格式”选项卡,然后单击浏览(“…”)按钮打开“选择格式”**对话框。 
- 在**“格式”框中,选择“标准”,再选择“货币”**,然后选择一种货币格式。 
- 单击**“确定”,然后再次单击“确定”关闭“文本框属性”**对话框。 .gif) 
- (可选)按 F5 生成应用程序并查看报表。在本示例中,您将看到**“Total Sales”**列值已显示为货币格式。 
设置表格表头的格式
- 单击该表,以便在表的上方和旁边显示列句柄和行句柄。 .gif) 注意 注意- 句柄是显示在表的上方和旁边的灰框。您可以使用句柄对列、行和表本身执行各种操作。穿过表顶部上下拉伸的句柄是列句柄。沿着表一侧拉伸的句柄是行句柄。列句柄和行句柄的交汇处是角部句柄。若要查看表句柄的示例,请参见添加表数据区域(Visual Studio 报表设计器)。 
- 选择第一行(包含列标题标签)的行句柄,然后单击**“加粗”**。 
- 单击表的标题行,然后单击**“背景色”。单击“Web”选项卡,然后选择“粉红玫瑰”。单击“确定”**。 
- (可选)单击 F5 生成应用程序并查看报表。下图显示了设置了格式的报表。 .gif) 
为表格格式报表定义组
- 单击该表,以便在表的上方和旁边显示列句柄和行句柄。 
- 右击任何行的句柄,再单击**“插入组”**。 
- 在**“常规”选项卡上的“分组方式”框中,在第一行选择 =Fields!LastName.Value,在第二行选择 =Fields!FirstName.Value。这会按销售人员的姓名对数据分组。请注意,您可以按照表数据区域中未使用但出现在“DataTable1”**字段中的字段对数据分组。 .gif) 
- 单击**“确定”**。 - 随即将向表中添加组头和组尾。 
按组汇总数据
- 单击组的标题行,然后单击**“背景色”。选择“Web”选项卡,然后选择“浅青色”。单击“确定”**。 
- 将每行中重复的**“TotalSales”**替换为组头中汇总组数据的表达式。 - 右击**“Total Sales”的组头,然后选择“属性”。随即将打开“文本框属性”**对话框。 
- 复制下面的文本并将其粘贴到**“值”**下拉列表中。 - =Sum(Fields!TotalSales.Value)
- 向此文本框应用货币格式。 
 
- 将每行中重复的名称替换为组头中包含两行内容的表达式。第一行是名字和姓氏。第二行是非空的销售量。 - 选择**“Last Name”**详细信息行中的表达式,然后将其删除。 
- 右击“Last Name”的组标题行,然后选择**“表达式”。复制下面的文本并将其粘贴在“编辑表达式”**对话框区域中。 - Fields!FirstName.Value + " " + Fields!LastName.Value + ": " + vbCrLf + Count(Fields!SalesOrderNumber.Value).ToString()
 - 下图显示了执行此步骤后的表达式编辑器。 .gif) 
- (可选)按 F5 生成应用程序并查看报表。下图显示了按每个销售人员的姓名分组后的表行。每个组头汇总相应组的详细信息行,其中显示销售人员的姓名、销售量和总销售额。 .gif) 
对表格格式报表中的组进行排序
- 选择表数据区域并打开**“表属性”**。 
- 单击**“组”选项卡。将自动选择唯一定义的组“table1_Group1”。单击“编辑”。随即将打开“分组和排序”**对话框。 - 验证打开的对话框是**“分组和排序属性”而非“表属性”。“表属性排序”**选项卡控制的是详细信息行的排序方式,而非组的排序方式。在下一过程中,您将设置详细信息行的排序。 
- 单击**“排序”选项卡。在“排序方式”框中的下拉列表中,选择“<表达式...>”。在“编辑表达式”**框中,键入要用作排序依据的表达式。例如: - =Count(Fields!SalesOrderNumber.Value)
- 单击**“确定”**。 .gif) 
- (可选)按 F5 生成应用程序并查看报表。现在,您的报表已按每个销售人员的销售量排序。 .gif) 
在表格格式报表中对组内的详细信息行进行排序
- 单击该表,以便在表的上方和旁边显示列句柄和行句柄。 
- 右击角部句柄,再单击**“属性”按钮。随即将打开“表属性”**对话框。 .gif) 注意 注意- 角部句柄是指列句柄和行句柄交汇处的句柄。 
- 在**“排序”选项卡上的“排序方式”框中,选择“=Fields!TotalSold.Value”。在“方向”框中,选择“降序”**。这将按销售额对明细数据排序,并在第一行显示最大的值。 
- 单击**“确定”**。 - “表属性”对话框的外观应类似于下图。 .gif) 
- (可选)按 F5 生成应用程序并查看报表。下图显示了所得报表的第 2 页,以演示具有多个详细信息行的组。 .gif) 
在表格格式报表的页脚中添加汇总数据
- 在表尾行中,选择“Sales Order”和“Total Sales”单元格。在选定的单元格中单击右键,然后选择**“合并单元格”**。 - 这将提供更多的空间来设置表中销售总和的格式。 
- 在合并后的单个单元格中单击右键,然后选择**“属性”**。 
- 在**“值”**下拉列表中,键入以下表达式: - =Sum(Fields!TotalSales.Value)
- 向合并后的单元格应用货币格式。 
- 在合并单元格旁边的文本框单元格中单击鼠标,然后创建一个标签。例如,键入**“Total Sold:”**。请注意,这完全是文本,而非表达式。 
- (可选)设置页脚行的背景色,使之与标题行的背景色匹配。 - 下图显示了表定义。 .gif) 
- (可选)按 F5 生成应用程序并查看报表。在呈现的报表中,单击报表工具栏上的**“最后一页”**按钮,以导航至报表的最后一页。滚动到底部,您将看到总销售额。 .gif) 
另请参见
参考
Microsoft.Reporting.WinForms.ReportViewer.Drillthrough
Microsoft.Reporting.WinForms.LocalReport.SubreportProcessing
Microsoft.Reporting.WebForms.ReportViewer.Drillthrough
Microsoft.Reporting.WebForms.LocalReport.SubreportProcessing