使用 WinForms ReportViewer 控件

若要查看已部署到报表服务器的报表或存在于本地文件系统上的报表,您可以使用 WinForms ReportViewer 控件在 Windows 应用程序中呈现这些报表。

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

  1. 使用 MicrosoftVisual C# 或 MicrosoftVisual Basic 创建新的 Windows 应用程序。

    - 或 -

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

  2. 在**“工具箱”中找到 ReportViewer 控件。如果“工具箱”不可见,则可以通过从“视图”菜单中选择“工具箱”**来对其进行访问。

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

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

将控件添加到该窗体之后,将显示**“ReportViewer 任务”智能标记并提示您选择一个报表。如果您要查看的报表已部署到报表服务器上,则从“选择报表”下拉列表中选择<服务器报表>选项。选中<服务器报表>选项后,将出现两个附加的属性:“报表服务器 URL”“报表路径”“报表服务器 URL”是指向相应报表服务器的地址,“报表路径”是指向要呈现的报表的完整路径。若要以本地模式查看报表,则选择“设计新报表”**选项以启动报表设计器或选择已是现有项目的一部分的报表。

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

下面的示例演示了如何使用 WinForms ReportViewer 控件呈现已部署到报表服务器的报表。此示例使用 AdventureWorks 示例报表项目随附的 Sales Order Detail 报表。有关如何部署该示例报表的详细信息,请参阅 SQL Server Reporting Services Product Samples(SQL Server Reporting Services 产品示例)。

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("http:// <Server Name>/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();
    }
}
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("http://<Server Name>/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 应用程序的一部分并且尚未部署到报表服务器的报表。此示例也使用了 SQL Server Reporting Services Product Samples(SQL Server Reporting Services 产品示例)项目中的 Sales Order Detail 报表。

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

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

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

  3. 浏览到 AdventureWorks 报表示例项目所安装的位置。

    默认位置为<驱动器>:\Program Files\Microsoft SQL Server\100\Samples\Reporting Services\Report Samples\AdventureWorks Sample Reports。有关如何安装示例的详细信息,请参阅安装 SQL Server 示例和示例数据库的注意事项

  4. 选择 Sales Order Detail.rdl 文件并单击**“添加”**按钮。

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

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

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

    注意注意

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

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

    如果**“属性”窗口不可见,则可以通过从“视图”菜单中选择“属性窗口”**来将其打开。

以下代码示例将为销售订单数据创建一个数据集,然后以本地模式呈现 Sales Order Detail 报表。

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");
        }
    }
}
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