使用 WinForms ReportViewer 控件 - SQL Server Reporting Services (SSRS)

2025-05-23 10:00:55

若要查看部署到本地文件系统上存在的报表服务器或报表的报表,请使用 WinForms ReportViewer 控件在 Windows 应用程序中呈现它们。

将 ReportViewer 控件添加到 Windows 应用程序

使用 Microsoft C# 或 Microsoft Visual Basic 创建新的 Windows 应用程序。

- 或 -

打开一个现有的 Windows 应用程序项目并添加一个新窗体。

在“工具箱”中找到 ReportViewer 控件。 如果工具箱不可见,可以通过选择“工具箱”从“视图”菜单访问它。

将 ReportViewer 控件拖到 Windows 窗体的设计图面上。

名为 reportViewer1 的 ReportViewer 控件便会添加到该窗体中。

此控件添加到该窗体之后,将出现“ReportViewer 任务”智能标记,并提示你选择一个报表。

如果要查看的报表已部署到报表服务器,请从“选择报表”下拉列表中选择<“服务器报表>”选项。 选择“服务器报表>”选项后,将显示另外两个属性:报表服务器 URL 和报表路径。< “报表服务器 URL”是指向相应报表服务器的地址,“报表路径”是指向要呈现的报表的完整路径。

如果想以本地模式查看报表,请选择“设计新报表”选项来启动报表设计器,或选择一个已是现有项目一部分的报表。

在远程处理模式下查看报表

以下示例演示如何使用 WinForms ReportViewer 控件呈现部署到报表服务器的报表。 此示例使用 AdventureWorks2022 示例报表项目随附的 Sales Order Detail 报表。

C#

public partial class Form1 : Form

{

private void Form1_Load(object sender, EventArgs e)

{

// Set the processing mode for the ReportViewer to Remote

reportViewer1.ProcessingMode = ProcessingMode.Remote;

ServerReport serverReport = reportViewer1.ServerReport;

// Get a reference to the default credentials

System.Net.ICredentials credentials =

System.Net.CredentialCache.DefaultCredentials;

// Get a reference to the report server credentials

ReportServerCredentials rsCredentials =

serverReport.ReportServerCredentials;

// Set the credentials for the server report

rsCredentials.NetworkCredentials = credentials;

// Set the report server URL and report path

serverReport.ReportServerUrl =

new Uri("https:// /reportserver");

serverReport.ReportPath =

"/AdventureWorks Sample Reports/Sales Order Detail";

// Create the sales order number report parameter

ReportParameter salesOrderNumber = new ReportParameter();

salesOrderNumber.Name = "SalesOrderNumber";

salesOrderNumber.Values.Add("SO43661");

// Set the report parameters for the report

reportViewer1.ServerReport.SetParameters(

new ReportParameter[] { salesOrderNumber });

// Refresh the report

reportViewer1.RefreshReport();

}

}

VB.NET

Imports Microsoft.Reporting.WinForms

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, _

ByVal e As System.EventArgs) _

Handles MyBase.Load

'Set the processing mode for the ReportViewer to Remote

reportViewer1.ProcessingMode = ProcessingMode.Remote

Dim serverReport As ServerReport

serverReport = reportViewer1.ServerReport

'Get a reference to the default credentials

Dim credentials As System.Net.ICredentials

credentials = System.Net.CredentialCache.DefaultCredentials

'Get a reference to the report server credentials

Dim rsCredentials As ReportServerCredentials

rsCredentials = serverReport.ReportServerCredentials

'Set the credentials for the server report

rsCredentials.NetworkCredentials = credentials

'Set the report server URL and report path

serverReport.ReportServerUrl = _

New Uri("https:///reportserver")

serverReport.ReportPath = _

"/AdventureWorks Sample Reports/Sales Order Detail"

'Create the sales order number report parameter

Dim salesOrderNumber As New ReportParameter()

salesOrderNumber.Name = "SalesOrderNumber"

salesOrderNumber.Values.Add("SO43661")

'Set the report parameters for the report

Dim parameters() As ReportParameter = {salesOrderNumber}

serverReport.SetParameters(parameters)

'Refresh the report

reportViewer1.RefreshReport()

End Sub

End Class

在本地处理模式下查看报表

以下示例演示如何呈现属于 Windows 应用程序的报表,并且未部署到报表服务器。

将 Sales Order Detail 报表添加到 Windows 应用程序

打开该报表将添加到的 Windows 项目。

从“项目”菜单中选择“添加现有项” 。

浏览到安装 AdventureWorks2022 报表示例项目的位置。

请转到 AdventureWorks 报表示例以下载报表示例

选择 Sales Order Detail.rdl 文件,然后选择“ 添加 ”按钮。

Sales Order Detail.rdl 文件现在应是该项目的一部分。

在“解决方案资源管理器”中右键单击 Sales Order Detail.rdl 文件,然后选择“重命名”。 将该报表重命名为“Sales Order Detail.rdlc”,然后按 Enter。

如果解决方案资源管理器不可见,可以通过选择解决方案资源管理器从“视图”菜单打开它。

注意

将文件扩展名 rdl 重命名为 rdlc 后,便可使用 Microsoft Visual Studio 2005 的报表设计器编辑该报表。

重命名报表后,选择该文件并找到属性窗口。 将“复制到输出目录”属性更改为“如果较新则复制”。

如果“属性”窗口不可见,可以通过选择“属性窗口”从“视图”菜单打开它。

下面的代码示例为销售订单数据创建数据集,然后以本地模式呈现销售订单详细信息报表。

C#

public partial class Form1 : Form

{

private void Form1_Load(object sender, EventArgs e)

{

// Set the processing mode for the ReportViewer to Local

reportViewer1.ProcessingMode = ProcessingMode.Local;

LocalReport localReport = reportViewer1.LocalReport;

localReport.ReportPath = "Sales Order Detail.rdlc";

DataSet dataset = new DataSet("Sales Order Detail");

string salesOrderNumber = "SO43661";

// Get the sales order data

GetSalesOrderData(salesOrderNumber, ref dataset);

// Create a report data source for the sales order data

ReportDataSource dsSalesOrder = new ReportDataSource();

dsSalesOrder.Name = "SalesOrder";

dsSalesOrder.Value = dataset.Tables["SalesOrder"];

localReport.DataSources.Add(dsSalesOrder);

// Get the sales order detail data

GetSalesOrderDetailData(salesOrderNumber, ref dataset);

// Create a report data source for the sales order detail

// data

ReportDataSource dsSalesOrderDetail =

new ReportDataSource();

dsSalesOrderDetail.Name = "SalesOrderDetail";

dsSalesOrderDetail.Value =

dataset.Tables["SalesOrderDetail"];

localReport.DataSources.Add(dsSalesOrderDetail);

// Create a report parameter for the sales order number

ReportParameter rpSalesOrderNumber = new ReportParameter();

rpSalesOrderNumber.Name = "SalesOrderNumber";

rpSalesOrderNumber.Values.Add("SO43661");

// Set the report parameters for the report

localReport.SetParameters(

new ReportParameter[] { rpSalesOrderNumber });

// Refresh the report

reportViewer1.RefreshReport();

}

private void GetSalesOrderData(string salesOrderNumber,

ref DataSet dsSalesOrder)

{

string sqlSalesOrder =

"SELECT SOH.SalesOrderNumber, S.Name AS Store, " +

" SOH.OrderDate, C.FirstName AS SalesFirstName, " +

" C.LastName AS SalesLastName, E.Title AS " +

" SalesTitle, SOH.PurchaseOrderNumber, " +

" SM.Name AS ShipMethod, BA.AddressLine1 " +

" AS BillAddress1, BA.AddressLine2 AS " +

" BillAddress2, BA.City AS BillCity, " +

" BA.PostalCode AS BillPostalCode, BSP.Name " +

" AS BillStateProvince, BCR.Name AS " +

" BillCountryRegion, SA.AddressLine1 AS " +

" ShipAddress1, SA.AddressLine2 AS " +

" ShipAddress2, SA.City AS ShipCity, " +

" SA.PostalCode AS ShipPostalCode, SSP.Name " +

" AS ShipStateProvince, SCR.Name AS " +

" ShipCountryRegion, CC.Phone AS CustPhone, " +

" CC.FirstName AS CustFirstName, CC.LastName " +

" AS CustLastName " +

"FROM Person.Address SA INNER JOIN " +

" Person.StateProvince SSP ON " +

" SA.StateProvinceID = SSP.StateProvinceID " +

" INNER JOIN Person.CountryRegion SCR ON " +

" SSP.CountryRegionCode = SCR.CountryRegionCode " +

" RIGHT OUTER JOIN Sales.SalesOrderHeader SOH " +

" LEFT OUTER JOIN Person.Contact CC ON " +

" SOH.ContactID = CC.ContactID LEFT OUTER JOIN" +

" Person.Address BA INNER JOIN " +

" Person.StateProvince BSP ON " +

" BA.StateProvinceID = BSP.StateProvinceID " +

" INNER JOIN Person.CountryRegion BCR ON " +

" BSP.CountryRegionCode = " +

" BCR.CountryRegionCode ON SOH.BillToAddressID " +

" = BA.AddressID ON SA.AddressID = " +

" SOH.ShipToAddressID LEFT OUTER JOIN " +

" Person.Contact C RIGHT OUTER JOIN " +

" HumanResources.Employee E ON C.ContactID = " +

" E.ContactID ON SOH.SalesPersonID = " +

" E.EmployeeID LEFT OUTER JOIN " +

" Purchasing.ShipMethod SM ON SOH.ShipMethodID " +

" = SM.ShipMethodID LEFT OUTER JOIN Sales.Store" +

" S ON SOH.CustomerID = S.CustomerID " +

"WHERE (SOH.SalesOrderNumber = @SalesOrderNumber)";

SqlConnection connection = new

SqlConnection("Data Source=(local); " +

"Initial Catalog=AdventureWorks; " +

"Integrated Security=SSPI");

SqlCommand command =

new SqlCommand(sqlSalesOrder, connection);

command.Parameters.Add(

new SqlParameter("SalesOrderNumber",

salesOrderNumber));

SqlDataAdapter salesOrderAdapter = new

SqlDataAdapter(command);

salesOrderAdapter.Fill(dsSalesOrder, "SalesOrder");

}

private void GetSalesOrderDetailData(string salesOrderNumber,

ref DataSet dsSalesOrder)

{

string sqlSalesOrderDetail =

"SELECT SOD.SalesOrderDetailID, SOD.OrderQty, " +

" SOD.UnitPrice, CASE WHEN " +

" SOD.UnitPriceDiscount IS NULL THEN 0 " +

" ELSE SOD.UnitPriceDiscount END AS " +

" UnitPriceDiscount, SOD.LineTotal, " +

" SOD.CarrierTrackingNumber, " +

" SOD.SalesOrderID, P.Name, P.ProductNumber " +

"FROM Sales.SalesOrderDetail SOD INNER JOIN " +

" Production.Product P ON SOD.ProductID = " +

" P.ProductID INNER JOIN " +

" Sales.SalesOrderHeader SOH ON " +

" SOD.SalesOrderID = SOH.SalesOrderID " +

"WHERE (SOH.SalesOrderNumber = @SalesOrderNumber) " +

"ORDER BY SOD.SalesOrderDetailID";

using (SqlConnection connection = new

SqlConnection("Data Source=(local); " +

"Initial Catalog=AdventureWorks; " +

"Integrated Security=SSPI"))

{

SqlCommand command =

new SqlCommand(sqlSalesOrderDetail, connection);

command.Parameters.Add(

new SqlParameter("SalesOrderNumber",

salesOrderNumber));

SqlDataAdapter salesOrderDetailAdapter = new

SqlDataAdapter(command);

salesOrderDetailAdapter.Fill(dsSalesOrder,

"SalesOrderDetail");

}

}

}

VB.NET

Imports System.Data.SqlClient

Imports Microsoft.Reporting.WinForms

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, _

ByVal e As System.EventArgs) _

Handles MyBase.Load

'Set the processing mode for the ReportViewer to Local

reportViewer1.ProcessingMode = ProcessingMode.Local

Dim localReport As LocalReport

localReport = reportViewer1.LocalReport

localReport.ReportEmbeddedResource = _

"ReportViewerIntro.Sales Order Detail.rdlc"

Dim dataset As New DataSet("Sales Order Detail")

Dim salesOrderNumber As String = "SO43661"

'Get the sales order data

GetSalesOrderData(salesOrderNumber, dataset)

'Create a report data source for the sales order data

Dim dsSalesOrder As New ReportDataSource()

dsSalesOrder.Name = "SalesOrder"

dsSalesOrder.Value = dataset.Tables("SalesOrder")

localReport.DataSources.Add(dsSalesOrder)

'Get the sales order detail data

GetSalesOrderDetailData(salesOrderNumber, dataset)

'Create a report data source for the sales

'order detail data

Dim dsSalesOrderDetail As New ReportDataSource()

dsSalesOrderDetail.Name = "SalesOrderDetail"

dsSalesOrderDetail.Value = _

dataset.Tables("SalesOrderDetail")

localReport.DataSources.Add(dsSalesOrderDetail)

'Create a report parameter for the sales order number

Dim rpSalesOrderNumber As New ReportParameter()

rpSalesOrderNumber.Name = "SalesOrderNumber"

rpSalesOrderNumber.Values.Add("SO43661")

'Set the report parameters for the report

Dim parameters() As ReportParameter = {rpSalesOrderNumber}

localReport.SetParameters(parameters)

'Refresh the report

reportViewer1.RefreshReport()

End Sub

Private Sub GetSalesOrderData(ByVal salesOrderNumber As String, _

ByRef dsSalesOrder As DataSet)

Dim sqlSalesOrder As String = _

"SELECT SOH.SalesOrderNumber, S.Name AS Store, " & _

" SOH.OrderDate, C.FirstName AS SalesFirstName, " & _

" C.LastName AS SalesLastName, E.Title AS " & _

" SalesTitle, SOH.PurchaseOrderNumber, " & _

" SM.Name AS ShipMethod, BA.AddressLine1 " & _

" AS BillAddress1, BA.AddressLine2 AS " & _

" BillAddress2, BA.City AS BillCity, " & _

" BA.PostalCode AS BillPostalCode, BSP.Name " & _

" AS BillStateProvince, BCR.Name AS " & _

" BillCountryRegion, SA.AddressLine1 AS " & _

" ShipAddress1, SA.AddressLine2 AS " & _

" ShipAddress2, SA.City AS ShipCity, " & _

" SA.PostalCode AS ShipPostalCode, SSP.Name " & _

" AS ShipStateProvince, SCR.Name AS " & _

" ShipCountryRegion, CC.Phone AS CustPhone, " & _

" CC.FirstName AS CustFirstName, CC.LastName " & _

" AS CustLastName " & _

"FROM Person.Address SA INNER JOIN " & _

" Person.StateProvince SSP ON " & _

" SA.StateProvinceID = SSP.StateProvinceID " & _

" INNER JOIN Person.CountryRegion SCR ON " & _

" SSP.CountryRegionCode = SCR.CountryRegionCode " & _

" RIGHT OUTER JOIN Sales.SalesOrderHeader SOH " & _

" LEFT OUTER JOIN Person.Contact CC ON " & _

" SOH.ContactID = CC.ContactID LEFT OUTER JOIN" & _

" Person.Address BA INNER JOIN " & _

" Person.StateProvince BSP ON " & _

" BA.StateProvinceID = BSP.StateProvinceID " & _

" INNER JOIN Person.CountryRegion BCR ON " & _

" BSP.CountryRegionCode = " & _

" BCR.CountryRegionCode ON SOH.BillToAddressID " & _

" = BA.AddressID ON SA.AddressID = " & _

" SOH.ShipToAddressID LEFT OUTER JOIN " & _

" Person.Contact C RIGHT OUTER JOIN " & _

" HumanResources.Employee E ON C.ContactID = " & _

" E.ContactID ON SOH.SalesPersonID = " & _

" E.EmployeeID LEFT OUTER JOIN " & _

" Purchasing.ShipMethod SM ON SOH.ShipMethodID " & _

" = SM.ShipMethodID LEFT OUTER JOIN Sales.Store" & _

" S ON SOH.CustomerID = S.CustomerID " & _

"WHERE (SOH.SalesOrderNumber = @SalesOrderNumber)"

Using connection As New SqlConnection( _

"Data Source=(local); " & _

"Initial Catalog=AdventureWorks; " & _

"Integrated Security=SSPI")

Dim command As New SqlCommand(sqlSalesOrder, connection)

Dim parameter As New SqlParameter("SalesOrderNumber", _

salesOrderNumber)

command.Parameters.Add(parameter)

Dim salesOrderAdapter As New SqlDataAdapter(command)

salesOrderAdapter.Fill(dsSalesOrder, "SalesOrder")

End Using

End Sub

Private Sub GetSalesOrderDetailData( _

ByVal salesOrderNumber As String, _

ByRef dsSalesOrder As DataSet)

Dim sqlSalesOrderDetail As String = _

"SELECT SOD.SalesOrderDetailID, SOD.OrderQty, " & _

" SOD.UnitPrice, CASE WHEN " & _

" SOD.UnitPriceDiscount IS NULL THEN 0 " & _

" ELSE SOD.UnitPriceDiscount END AS " & _

" UnitPriceDiscount, SOD.LineTotal, " & _

" SOD.CarrierTrackingNumber, " & _

" SOD.SalesOrderID, P.Name, P.ProductNumber " & _

"FROM Sales.SalesOrderDetail SOD INNER JOIN " & _

" Production.Product P ON SOD.ProductID = " & _

" P.ProductID INNER JOIN " & _

" Sales.SalesOrderHeader SOH ON " & _

" SOD.SalesOrderID = SOH.SalesOrderID " & _

"WHERE (SOH.SalesOrderNumber = @SalesOrderNumber) " & _

"ORDER BY SOD.SalesOrderDetailID"

Using connection As New SqlConnection( _

"Data Source=(local); " & _

"Initial Catalog=AdventureWorks; " & _

"Integrated Security=SSPI")

Dim command As New SqlCommand(sqlSalesOrderDetail, _

connection)

Dim parameter As New SqlParameter("SalesOrderNumber", _

salesOrderNumber)

command.Parameters.Add(parameter)

Dim salesOrderDetailAdapter As New SqlDataAdapter(command)

salesOrderDetailAdapter.Fill(dsSalesOrder, _

"SalesOrderDetail")

End Using

End Sub

End Class

相关内容

使用 ReportViewer 控件集成 Reporting Services