動態修改報表(RDLC)的資料來源

動態修改報表(RDLC)的資料來源

小布最近在研究Reporting的部分,也上網找到一些資料,在這邊記錄一下,免得過幾天又忘記了。如果各位高手有更好的方法或任何建議,還請各位指導小布囉!!

拜讀<鳥毅的Blog: 動態改變RDLC報表DataSource>後,我也以SQL 2005 AdventureWorks資料庫做了一個範例:

  1. 用VS 2008開啟新的ASP.NET報表網站專案,利用報表精靈新增一個rdlc檔,連結到AdventureWorks 的Employee Table (SELECT * FROM HumanResources.Employee ),並且建立一個Web Form,透過Report Viewer來連結rdlc檔。詳細步驟請參照<Creating Client Report Definition (.rdlc) Files>,這邊就省略不說囉!! 範例專案內容如圖...image
  2. 因為無法傳遞參數給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內容了!
  3. 假設小布要找出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]

image

[動態變更DataSource後]

image

 

 

Brian 的標籤:,,