To view reports that are deployed to a report server or reports that exist on the local file system, use the WinForms ReportViewer control to render them in a Windows application.
Screenshot of the Toolbox, highlighting ReportViewer control." />
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 is deployed to a report server, select the option from the Choose Report drop-down list. After the option is selected, two more properties appear: Report Server Url and Report Path. The Report Server Url is the address to the report server and the Report Path is the full path to the report to render.
Screenshot of the ReportViewer Tasks smart tag, highlighting the 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.
Screenshot of the ReportViewer Tasks smart tag, highlighting the local report." />
The following example demonstrates how to render a report that is deployed to a report server using the WinForms ReportViewer control. This example uses the Sales Order Detail report that is included with the AdventureWorks2022 sample reports project.
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 = serverReport.SetParameters(parameters) 'Refresh the report reportViewer1.RefreshReport() End Sub End Class
The following example demonstrates how to render a report that is part of the Windows application and isn't deployed to a report server.
Screenshot of the Solution Explorer, highlighting the Sales Order Detail Report." />
Note Renaming the file extension from rdl to rdlc will allow you to edit the report using report designer for Microsoft Visual Studio 2005.
Screenshot of the Properties window, highlighting the Copy To Output setting." />
The following code example creates a dataset for the sales order data and then renders the Sales Order Detail report in local mode.
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 = 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