Utilizzo del controllo Windows Form ReportViewerUsing the WinForms ReportViewer Control

Per visualizzare i report distribuiti in un server di report o presenti in un file system locale, è possibile usare il controllo Windows Form ReportViewer per eseguirne il rendering in un'applicazione Windows.To view reports that have been deployed to a report server or reports that exist on the local file system, you can use the WinForms ReportViewer control to render them in a Windows application.

Per aggiungere il controllo ReportViewer a un'applicazione WindowsTo add the ReportViewer Control to a Windows application

  1. Creare una nuova applicazione Windows usando MicrosoftMicrosoft Visual C#Visual C# o MicrosoftMicrosoft Visual BasicVisual Basic.Create a new Windows application using either MicrosoftMicrosoft Visual C#Visual C# or MicrosoftMicrosoft Visual BasicVisual Basic.

    - oppure -- Or -

    Aprire un progetto Applicazione Windows esistente e aggiungere un nuovo form.Open an exiting Windows application project and add a new form.

  2. Individuare il controllo ReportViewer nella casella degli strumenti.Locate the ReportViewer control in the Toolbox. Se la casella degli strumenti non è visibile, è possibile accedervi scegliendo Casella degli strumenti dal menu View.If the Toolbox is not visible, you can access it from the View menu by selecting Toolbox.

    Selezione del controllo ReportViewerSelecting ReportViewer control

  3. Trascinare il controllo ReportViewer nell'area di progettazione di Windows Form.Drag the ReportViewer control onto the design surface of the Windows Form.

    Un controllo ReportViewer denominato reportViewer1 viene aggiunto al form.A ReportViewer control named reportViewer1 is added to the form.

    Dopo l'aggiunta del controllo al form, viene visualizzato lo smart tag Attività di ReportViewer che richiede di selezionare un report.After the control is added to the form, the ReportViewer Tasks smart tag appears and prompts you to select a report.

    Se il report da visualizzare è stato distribuito in un server di report, scegliere l'opzione <Server di report> dall'elenco a discesa Scegli report.If the report you wish to view has been deployed to a report server, select the <Server Report> option from the Choose Report drop-down list. Dopo avere scelto l'opzione <Server di report>, vengono visualizzate due proprietà aggiuntive: URL server di report e Percorso report.After the <Server Report> option is selected, two additional properties appear: Report Server Url and Report Path. URL server di report è l'indirizzo del server di report e Percorso report è il percorso completo del report di cui eseguire il rendering.The Report Server Url is the address to the report server and the Report Path is the full path to the report to render.

    Selezionare report serverSelect server report

    Se il report da visualizzare è un report in modalità locale, selezionare l'opzione Progetta nuovo report per avviare la progettazione del report oppure selezionare un report che fa già parte del progetto esistente.If the report you wish to view a report in local mode, select either the Design a new report option to launch the report designer or select a report that is already part of the existing project.

    Selezionare report localeSelect local report

Visualizzazione di report in modalità di elaborazione remotaViewing Reports in Remote Processing Mode

Nell'esempio seguente viene illustrato come eseguire il rendering di un report distribuito in un server di report mediante il controllo Windows Form ReportViewer.The following example demonstrates how to render a report that has been deployed to a report server using the WinForms ReportViewer control. In questo esempio viene usato il report Sales Order Detail incluso nel progetto di report di esempio AdventureWorks2012AdventureWorks2012.This example uses the Sales Order Detail report that is included with the AdventureWorks2012AdventureWorks2012 sample reports project.

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

VB.NETVB.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("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  

Visualizzazione di report in modalità di elaborazione localeViewing Reports in Local Processing Mode

Nell'esempio seguente viene illustrato come eseguire il rendering di un report che fa parte di un'applicazione Windows e non è stato distribuito in un server di report.The following example demonstrates how to render a report that is part of the Windows application and has not been deployed to a report server.

Per aggiungere il report Sales Order Detail a un'applicazione WindowsTo add the Sales Order Detail report to a Windows application

  1. Aprire il progetto Windows a cui verrà aggiunto il report.Open the Windows project to which the report will be added.

  2. Dal menu Progetto selezionareAdd Existing Item(Aggiungi elemento esistente).From the Project menu, select Add Existing Item.

  3. Passare al percorso di installazione del progetto dei report di esempio di AdventureWorks2012AdventureWorks2012.Browse to the location where you installed the AdventureWorks2012AdventureWorks2012 Report Samples project.

    Per scaricare i report di esempio, andare alla pagina Report di esempio AdventureWorks 2012The download the report samples, go to AdventureWorks 2012 Report Samples

  4. Selezionare il file Sales Order Detail.rdl e fare clic sul pulsante Aggiungi.Select the Sales Order Detail.rdl file and click the Add button.

    Il file Sales Order Detail.rdl dovrebbe ora far parte del progetto.The Sales Order Detail.rdl file should now be part of the project.

    Report Sales Detail OrderSales Order Detail Report

  5. Fare clic con il pulsante destro del mouse sul file Sales Order Detail.rdl in Esplora soluzioni e selezionare Rinomina.Right-click the Sales Order Detail.rdl file in Solution Explorer and select Rename. Rinominare il report in Sales Order Detail.rdlc e premere INVIO.Rename the report to Sales Order Detail.rdlc and press ENTER.

    Se Esplora soluzioni non è visibile, è possibile aprirlo scegliendo Esplora soluzioni dal menu Visualizza.If Solution Explorer is not visible, you can open it from the View menu by selecting Solution Explorer.

    Nota

    La modifica dell'estensione di file da rdl in rdlc consente di modificare il report usando Progettazione report per MicrosoftMicrosoft Visual Studio 2005Visual Studio 2005.Renaming the file extension from rdl to rdlc will allow you to edit the report using report designer for MicrosoftMicrosoft Visual Studio 2005Visual Studio 2005.

  6. Dopo aver rinominato il report, selezionare il file e individuare la finestra Proprietà.After the report has been renamed, select the file and locate the Properties window. Modificare la proprietà Copia nella directory di output in Copia se più recente.Change the Copy to Output Directory property to Copy if Newer.

    Configurazione dell'impostazione Copia nella directory di outputConfiguring Copy To Output setting

    Se la finestra Proprietà non è visibile, è possibile aprirla scegliendo Finestra Proprietà dal menu Visualizza.If the Properties window is not visible, you can open it from the View menu by selecting Properties Window.

    Nell'esempio di codice seguente viene creato un set di dati per i dati dell'ordine di vendita, quindi viene eseguito il rendering del report Sales Order Detail in modalità locale.The following code example will create a dataset for the sales order data and then render the Sales Order Detail report in local mode.

C#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.NETVB.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  

Vedere ancheSee Also

Integrazione di Reporting Services tramite i controlli ReportViewerIntegrating Reporting Services Using the ReportViewer Controls