Freigeben über


Verwenden des ReportViewer-Steuerelements in WinForms

Zur Anzeige von Berichten, die auf einem Berichtsserver bereitgestellt werden oder die sich auf einem lokalen Dateisystem befinden, können Sie das ReportViewer-Steuerelement für WinForms verwenden, um die Berichte in eine Windows-Anwendung zu rendern.

So fügen Sie das ReportViewer-Steuerelement zu einer Windows-Anwendung hinzu

  1. Erstellen Sie entweder mit MicrosoftVisual C# oder mit MicrosoftVisual Basic eine neue Windows-Anwendung.

    - Oder -

    Öffnen Sie ein bestehendes Windows-Anwendungsprojekt, und fügen Sie ein neues Formular hinzu.

  2. Suchen Sie das ReportViewer-Steuerelement in der Toolbox. Wenn die Toolbox nicht sichtbar ist, können Sie darauf im Menü Ansicht zugreifen, indem Sie Toolbox auswählen.

  3. Ziehen Sie das ReportViewer-Steuerelement auf die Entwurfsoberfläche der Windows Form.

    Ein als reportViewer1 bezeichnete ReportViewer-Steuerelement wird zum Formular hinzugefügt.

Nachdem das Steuerelement zum Formular hinzugefügt wurde, wird das SmartTag ReportViewer-Aufgaben angezeigt, und Sie werden aufgefordert, einen Bericht auszuwählen. Wenn der Bericht, den Sie anzeigen möchten, auf einem Berichtsserver bereitgestellt wurde, wählen Sie die Option <Serverbericht> aus der Dropdownliste Bericht wählen. Nachdem die Option <Serverbericht> aktiviert wurde, werden zwei weitere Eigenschaften angezeigt: Berichtsserver-URL und Berichtspfad. Die Berichtsserver-URL entspricht der Adresse des Berichtsservers, und der Berichtspfad entspricht dem vollen Pfad zu dem Bericht, der gerendert werden soll. Um einen Bericht im lokalen Modus anzuzeigen, aktivieren Sie entweder die Option Neuen Bericht entwerfen, um den Berichts-Designer zu starten, oder Sie wählen einen Bericht aus, der bereits Teil eines bestehenden Projekts ist.

Anzeigen von Berichten im Remoteverarbeitungsmodus

Im folgenden Beispiel wird veranschaulicht, wie ein Bericht, der mit dem ReportViewer-Steuerelement in WinForms auf einem Berichtsserver bereitgestellt wurde, gerendert wird. In diesem Beispiel wird der Bericht für Auftragsdetails, der im Projekt für Beispielberichte AdventureWorks enthalten ist, verwendet. Weitere Informationen zum Bereitstellen dieses Beispielberichts finden Sie unter SQL Server Reporting Services Product Samples.

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

Anzeigen von Berichten im lokalen Verarbeitungsmodus

Im folgenden Beispiel wird veranschaulicht, wie ein Bericht, der Teil der Windows-Anwendung ist und nicht bereitgestellt wurde, gerendert wird. Auch in diesem Beispiel wird der Bericht "Sales Order Detail" aus dem Projekt SQL Server Reporting Services Product Samples verwendet.

So fügen Sie den Bericht "Sales Order Detail" zu einer Windows-Anwendung hinzu

  1. Öffnen Sie das Windows-Projekt, zu dem der Bericht hinzugefügt werden soll.

  2. Aktivieren Sie im Menü Projekt die Option Vorhandenes Element hinzufügen.

  3. Wechseln Sie zu der Position, an der das Projekt für AdventureWorks-Beispielberichte installiert ist.

    Der Standardspeicherort lautet <drive>:\Programme\Microsoft SQL Server\100\Samples\Reporting Services\Report Samples\AdventureWorks Sample Reports. Weitere Informationen über die Installation der Beispiele finden Sie unter Überlegungen zum Installieren der SQL Server-Beispiele und -Beispieldatenbanken.

  4. Wählen Sie die Datei Sales Order Detail.rdl aus, und klicken Sie auf die Schaltfläche Hinzufügen.

    Die Datei Sales Order Detail.rdl sollte jetzt ein Teil des Projekts sein.

  5. Klicken Sie mit der rechten Maustaste auf die Datei Sales Order Detail.rdl im Projektmappen-Explorer, und wählen Sie Umbenennen aus. Benennen Sie den Bericht in Sales Order Detail.rdlc um, und drücken Sie die Eingabetaste.

    Wenn der Projektmappen-Explorer nicht sichtbar ist, können Sie ihn im Menü Ansicht öffnen, indem Sie Projektmappen-Explorer auswählen.

    HinweisHinweis

    Durch Umbenennen der Dateierweiterung von RDL zu RDLC können Sie den Bericht mit dem Berichts-Designer für MicrosoftVisual Studio 2005 bearbeiten.

  6. Wählen Sie nach dem Umbenennen des Berichts die Datei aus, und suchen Sie das Eigenschaftenfenster. Ändern Sie die Eigenschaft In Ausgabeverzeichnis kopieren zu Kopieren, wenn neuer.

    Wenn das Eigenschaftenfenster nicht sichtbar ist, können Sie es im Menü Ansicht öffnen, indem Sie Eigenschaftenfenster auswählen.

Mit dem folgenden Codebeispiel wird ein Dataset für die Auftragsdaten erstellt. Dann wird der Bericht für Auftragsdetails im lokalen Modus erstellt.

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