小布最近在研究Reporting的部分,也上網找到一些資料,在這邊記錄一下,免得過幾天又忘記了。如果各位高手有更好的方法或任何建議,還請各位指導小布囉!!
拜讀<鳥毅的Blog: 動態改變RDLC報表DataSource>後,我也以SQL 2005 AdventureWorks資料庫做了一個範例:
- 用VS 2008開啟新的ASP.NET報表網站專案,利用報表精靈新增一個rdlc檔,連結到AdventureWorks 的Employee Table (SELECT * FROM HumanResources.Employee ),並且建立一個Web Form,透過Report Viewer來連結rdlc檔。詳細步驟請參照<Creating Client Report Definition (.rdlc) Files>,這邊就省略不說囉!! 範例專案內容如圖...

- 因為無法傳遞參數給Local Report檔(rdlc),所以要做到執行階段動態修改報表內容,就必須針對報表來源下手。開啟rdlc檔(Report.rdlc),其實rdlc跟rdl一樣,都是XML檔。其中包含兩個tag <DataSetName>及<DataSet>,以這個範例來說,我在建立資料來源時是以預設的名稱,所以Dataset名稱為AdventureWorksDataSet,Table是Employee。應此在Report.rdlc中可以找到<DataSetName>AdventureWorksDataSet_Employee</DataSetName> 及 <DataSet Name="AdventureWorksDataSet_Employee">,這就是重點啦! 只要知道這個DataSet Name後,我們就可以動態來修改Report.rdlc的DataSource內容了!
- 假設小布要找出Employee中單身的員工資料,而不是用預設抓出所有資料,所以在Default.aspx的Page Load事件中修改如下:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim cnn As New SqlConnection(ConfigurationManager.ConnectionStrings("AdventureWorksConnectionString").ConnectionString)
Dim cmd As New SqlCommand("SELECT * FROM HumanResources.Employee WHERE MaritalStatus='S'", cnn)
Dim da As New SqlDataAdapter(cmd)
'將動態Select出來的資料填入Datatable當資料來源
Dim dt As New DataTable
da.Fill(dt)
'將ReportViewer1的DataSources集合清除
ReportViewer1.LocalReport.DataSources.Clear()
'然後重新新增一個名稱為"AdventureWorksDataSet_Employee"的ReportDataSource給ReportViewer1
ReportViewer1.LocalReport.DataSources.Add(New ReportDataSource("AdventureWorksDataSet_Employee", dt))
ReportViewer1.LocalReport.Refresh()
End Sub將dt塞到ReportDataSource,並且將DataSource名稱設定跟Report.rdlc的DataSet名稱一樣,這樣就完成囉!! 來看一下結果吧!
[預設的DataSource]

[動態變更DataSource後]
