以下說明各目錄或檔案的功用
- 在App_Code底下我們建立一個Report的目錄,用來儲放報表檔使用的資料集物件。
- 根目錄底下的Report目錄則儲放報表檔(Customers.rdlc)。
- first.aspx嵌入ReportViewer控制項。
- first.aspx.cs處理ReportViewer該讀取那個報表檔及資料繫結部份。
接著我們正式開始撰寫報表,首先我們先建立資料集物件,建立資料集物件的目的在於作為報表檔的Report Data,在App_Code目錄下的Report目錄上點選滑鼠右鍵新增項目
選擇資料集並將檔名命名為Customers.xsd後按下新增按鈕,
接著我們將Toolbox裡的DataTable拖曳至設計畫面並增加相關欄位
在完成資料集後我們進行報表設計,在根目錄下的Report目錄上按滑鼠右鍵新增報表,並將報表檔名命名為Customers.rdlc
進入報表設計畫面後我們先將事先定義好的資料集加入Report Data,如果沒有看到Report Data畫面,則需要利用滑鼠點擊報表設計畫面,然後同時按下Ctrl+Alt+D鍵
在Data Source下拉選單挑選Customers及在Available datasets下拉選單挑選Customer並將Name命名為Customer
加入資料集後將頁籤切換至Toolbox,將Table控制項拖曳到報表畫面後新增一個欄位
再依序將Report Data中的Customer資料集欄位拖曳至設計畫面裡Table的Data區塊
完成報表設計後我們進行網頁程式的撰寫,以下為aspx、aspx.cs內容及執行畫面
aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="first.aspx.cs" Inherits="first" %>
<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<rsweb:ReportViewer ID="rptviewer" runat="server" Width="100%" Height="600px" />
</div>
</form>
</body>
</html>
aspx.csusing System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class first : System.Web.UI.Page { protected void Page_Init(object sender, EventArgs e) { DataTable dt = new DataTable(); SqlCommand cmd = new SqlCommand(); cmd.Connection = new SqlConnection("Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI;"); cmd.CommandText = "SELECT CustomerID, CompanyName, ContactName, ContactTitle FROM Customers"; SqlDataAdapter da = new SqlDataAdapter(cmd); try { da.Fill(dt); } catch (Exception ex) { throw ex; } finally { cmd.Connection.Close(); } rptviewer.LocalReport.ReportPath = Server.MapPath("/WebSite/Report/Customers.rdlc"); rptviewer.LocalReport.DataSources.Clear(); rptviewer.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource("Customer", dt)); rptviewer.LocalReport.Refresh(); } }
程式說明
- LocalReport.ReportPath是指定報表所在路徑。
- ReportDataSource("Customer", dt))是將dt(實際產出的資料)與資料集對應。
- LocalReport.Refresh()使報表將資料render。
針對程式部份有幾處需要注意的
- aspx程式需要包含ScriptManager控制項,否則會產生錯誤。
- aspx.cs程式需將報表相關程式放在Page_Init事件,否則執行時畫面會一直refresh。
- dt的欄位名稱與資料集中的欄位名稱不同時,需要特別處理。