WinForms ReportViewer 컨트롤 사용Using the WinForms ReportViewer Control

보고서 서버에 배포된 보고서 또는 로컬 파일 시스템에 있는 보고서를 보려면 WinForms ReportViewer 컨트롤을 사용하여 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.

ReportViewer 컨트롤을 Windows 응용 프로그램에 추가하려면To add the ReportViewer Control to a Windows application

  1. MicrosoftMicrosoft Visual C#Visual C# 또는 MicrosoftMicrosoft Visual BasicVisual Basic을 사용하여 새 Windows 응용 프로그램을 만듭니다.Create a new Windows application using either MicrosoftMicrosoft Visual C#Visual C# or MicrosoftMicrosoft Visual BasicVisual Basic.

    - 또는 -- Or -

    기존 Windows 응용 프로그램 프로젝트를 열고 새 폼을 추가합니다.Open an exiting Windows application project and add a new form.

  2. 도구 상자에서 ReportViewer 컨트롤을 찾습니다.Locate the ReportViewer control in the Toolbox. 도구 상자가 보이지 않을 경우 보기 메뉴에서 도구 상자를 선택하여 액세스할 수 있습니다.If the Toolbox is not visible, you can access it from the View menu by selecting Toolbox.

    ReportViewer 컨트롤 선택Selecting ReportViewer control

  3. ReportViewer 컨트롤을 Windows Form의 디자인 화면으로 끌어 놓습니다.Drag the ReportViewer control onto the design surface of the Windows Form.

    이름이 reportViewer1인 ReportViewer 컨트롤이 폼에 추가됩니다.A ReportViewer control named reportViewer1 is added to the form.

    컨트롤이 폼에 추가되면 ReportViewer 태스크 스마트 태그가 나타나 보고서를 선택하도록 알립니다.After the control is added to the form, the ReportViewer Tasks smart tag appears and prompts you to select a 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. <서버 보고서> 옵션이 선택되면 보고서 서버 URL보고서 경로의 두 가지 속성이 추가로 나타납니다.After the <Server Report> option is selected, two additional properties appear: Report Server Url and Report Path. 보고서 서버 URL은 보고서 서버에 대한 주소이고 보고서 경로는 렌더링할 보고서의 전체 경로입니다.The Report Server Url is the address to the report server and the Report Path is the full path to the report to render.

    서버 보고서 선택Select server report

    로컬 모드로 보고서를 보려는 경우 새 보고서 디자인 옵션을 선택하여 보고서 디자이너를 시작하거나 기존 프로젝트에 속한 보고서를 선택합니다.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.

    로컬 보고서 선택Select local report

원격 처리 모드로 보고서 보기Viewing Reports in Remote Processing Mode

다음 예는 WinForms ReportViewer 컨트롤을 사용하여 보고서 서버에 배포된 보고서를 렌더링하는 방법을 보여 줍니다.The following example demonstrates how to render a report that has been deployed to a report server using the WinForms ReportViewer control. 이 예에서는 AdventureWorks2012AdventureWorks2012 예제 보고서 프로젝트에 포함된 Sales Order Detail 보고서를 사용합니다.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  

로컬 처리 모드로 보고서 보기Viewing Reports in Local Processing Mode

다음 예는 Windows 응용 프로그램의 일부이고 보고서 서버에 배포되지 않은 보고서를 렌더링하는 방법을 보여 줍니다.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.

Sales Order Detail 보고서를 Windows 응용 프로그램에 추가하려면To add the Sales Order Detail report to a Windows application

  1. 보고서를 추가할 Windows 프로젝트를 엽니다.Open the Windows project to which the report will be added.

  2. 프로젝트 메뉴에서 기존 항목 추가를 선택합니다.From the Project menu, select Add Existing Item.

  3. AdventureWorks2012AdventureWorks2012 보고서 샘플 프로젝트를 설치한 위치를 찾습니다.Browse to the location where you installed the AdventureWorks2012AdventureWorks2012 Report Samples project.

    보고서 샘플을 다운로드하려면 AdventureWorks 2012 보고서 샘플(영문)로 이동합니다.The download the report samples, go to AdventureWorks 2012 Report Samples

  4. Sales Order Detail.rdl 파일을 선택하고 추가 단추를 클릭합니다.Select the Sales Order Detail.rdl file and click the Add button.

    이제 Sales Order Detail.rdl 파일이 프로젝트의 일부여야 합니다.The Sales Order Detail.rdl file should now be part of the project.

    판매 주문 세부 정보 보고서Sales Order Detail Report

  5. 솔루션 탐색기에서 Sales Order Detail.rdl 파일을 마우스 오른쪽 단추로 클릭하고 이름 바꾸기를 선택합니다.Right-click the Sales Order Detail.rdl file in Solution Explorer and select Rename. 보고서 이름을 Sales Order Detail.rdlc로 바꾸고 ENTER 키를 누릅니다.Rename the report to Sales Order Detail.rdlc and press ENTER.

    솔루션 탐색기가 보이지 않으면 보기 메뉴에서 솔루션 탐색기를 선택하여 열 수 있습니다.If Solution Explorer is not visible, you can open it from the View menu by selecting Solution Explorer.

    참고

    파일 확장명을 rdl에서 rdlc로 바꾸면 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. 보고서 이름을 변경했으면 파일을 선택하고 속성 창을 찾습니다.After the report has been renamed, select the file and locate the Properties window. 출력 디렉터리로 복사 속성을 변경된 내용만 복사로 변경합니다.Change the Copy to Output Directory property to Copy if Newer.

    출력에 복사 설정 구성Configuring Copy To Output setting

    속성 창이 보이지 않으면 보기 메뉴에서 속성 창을 선택하여 열 수 있습니다.If the Properties window is not visible, you can open it from the View menu by selecting Properties Window.

    다음 코드 예에서는 판매 주문 데이터에 대한 데이터 집합을 만든 다음 Sales Order Detail 보고서를 로컬 모드에서 렌더링합니다.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  

관련 항목:See Also

ReportViewer 컨트롤을 사용하여 Reporting Services 통합Integrating Reporting Services Using the ReportViewer Controls