若要檢視已部署至報表伺服器或存在於本機檔案系統的報表,您可以使用 WinForms ReportViewer 控制項在 Windows 應用程式中加以轉譯。
將 ReportViewer 控制項加入至 Windows 應用程式
- 使用 Microsoft Visual C# 或 Microsoft Visual Basic 建立新的 Windows 應用程式。
- 或 -
開啟現有的 Windows 應用程式專案並加入的新表單。 - 在 [工具箱] 中找出 ReportViewer 控制項。如果看不到 [工具箱],可以從 [檢視] 功能表選取 [工具箱] 加以存取。
- 拖曳 ReportViewer 控制項至 Windows Form 的設計介面。
名為 reportViewer1 的 ReportViewer 控制項會加入至表單。
在控制項加入至表單後,[ReportViewer 工作] 智慧標籤會顯示,並提示您選取報表。如果您想要撿視的報表已經部署到報表伺服器,請從 [選擇報表] 下拉式清單選取 [<伺服器報表>] 選項。 After the <Server Report> option is selected, two additional properties appear: Report Server Url and Report Path.[報表伺服器 Url] 是到報表伺服器的位址,[報表路徑] 則是要轉譯之報表的完整路徑。若要以本機模式檢視報表,請選取 [設計新報表] 選項以啟動報表設計師,或選取已是現有專案一部分的報表。

下列範例示範如何使用 WinForms ReportViewer 控制項轉譯已部署到報表伺服器的報表。這個範例使用包含在 AdventureWorks2008R2 範例報表專案中的 Sales Order Detail 報表。如需有關如何部署這個範例報表的詳細資訊,請參閱<AdventureWorks 報表範例>。
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 應用程式的一部分且尚未部署到報表伺服器的報表。這個範例也會使用 AdventureWorks 報表範例 專案的 Sales Order Detail 報表。
將 Sales Order Detail 報表加入至 Windows 應用程式
- 開啟其中將加入此報表的 Windows 專案。
- 從 [專案] 功能表上,選取 [加入現有項目]。
- 瀏覽到安裝 AdventureWorks2008R2 Report Samples 專案的位置。
預設位置是 <drive>:/Program Files/Microsoft SQL Server/100/Samples/Reporting Services/Report Samples/AdventureWorks Sample Reports。如需有關如何安裝範例的詳細資訊,請參閱<安裝 SQL Server 範例和範例資料庫的考量>。 - 選取 Sales Order Detail.rdl 檔案,然後按一下 [加入] 按鈕。
Sales Order Detail.rdl 檔案現在應該是專案的一部分。 - 在 [方案總管] 中,以滑鼠右鍵按一下 Sales Order Detail.rdl 檔案,然後選擇 [重新命名]。將報表重新命名為 Sales Order Detail.rdlc,然後按 ENTER 鍵。
如果看不到方案總管,可以從 [檢視] 功能表選取 [方案總管] 加以開啟。
附註:
將副檔名從 rdl 重新命名為 rdlc 可以讓您使用 Microsoft Visual Studio 的報表設計師編輯報表。 - 在報表重新命名後,選取檔案並找出 [屬性] 視窗。將 [複製到輸出目錄] 屬性變更為 [有更新時才複製]。
如果看不到 [屬性] 視窗,可以從 [檢視] 功能表選取 [屬性視窗] 加以開啟。
下列的程式碼範例會為銷售訂單資料建立資料集,然後以本機模式轉譯 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"); } } }