lionab資管物語

關於部落格
這是一個資訊管理, ERP, 3C, 旅遊, 勸敗的分享園地
  • 145071

    累積人氣

  • 10

    今日人氣

    0

    訂閱人氣

如何動態更換ReportViewer的RDLC及DataSource

同樣的問題在不同人手上就有不同的作法, 我因為是新手, 所以選擇簡單的方法.
我喜好將SQL查詢語句寫在Store Procedure裡, 在本例裡因為有四個報表所以會有四個 StoreProcedure.
因此在版面上需要有四個ObjectDataSource物件, 分別對應到不同的StoreProcedure.
版面範例如下:
我希望在使用者按下[檢視報表]Buttom後, 系統根據使用者選擇不同的 報表(RadioButtonList), 以執行更換ReportViewer裡不同的RDLC及DataSource 的動作.
一. 設定 RDLC 檔案名稱及路徑

我把待會要設定 RDLC 的檔名及路徑放在 RadioButtonList 裡各自項目的Value裡.

二. 設定 Button1_Click 事件
使用者按下[檢視報表]按鈕後, 系統要作的事情是更換ReportViewer裡RDLC及DataSource 的設定, 並顯示報表預覽.
Button1_Click 事件裡程式碼如下:

protected void Button1_Click(object sender, EventArgs e)
    {
        // 建立新的 ReportDataSource 物件
        ReportDataSource rds = new Microsoft.Reporting.WebForms.ReportDataSource();
        switch(RadioButtonList1.SelectedItem.ToString())
        {
            case "部門統計":
                rds.DataSourceId = "ObjectDataSource1";
                break;
            case "全公司統計":
                rds.DataSourceId = "ObjectDataSource2";
                break;
            case "各本部統計":
                rds.DataSourceId = "ObjectDataSource3";
                break;
            case "明細":
                rds.DataSourceId = "ObjectDataSource4";
                break;
        }
        rds.Name = "DataSet1";
        // 把 ReportViewer1 狀態重設
        //將ReportViewer1的DataSources集合清除
        ReportViewer1.LocalReport.DataSources.Clear();
        //將ReportViewer1重置為初始狀態           
        ReportViewer1.Reset();
        ReportViewer1.LocalReport.Refresh();
        // 給 ReportViewer1 新的設定
        // 用RadioButtonList的 Value 設定 ReportPath
        ReportViewer1.LocalReport.ReportPath = RadioButtonList1.SelectedValue;  
        // 設定 ReportViewer1 的 DataSources
        ReportViewer1.LocalReport.DataSources.Add(rds);                                      
        ReportViewer1.LocalReport.Refresh();

        // 建立報表參數陣列變數
         ReportParameter[] para = new ReportParameter[1]; 
         // 將第一個變數放入陣列裡第一個位置
        para[0]=new ReportParameter("yearmonth",DropDownList1.SelectedValue); 
         // 設定 ReportViewer1 的參數, 把值傳過去
         this.ReportViewer1.LocalReport.SetParameters(para); 
    }

程式說明:
1. 首先要先建立新的 ReportDataSource 物件, 因為待會要指定給ReportViewer1的 DataSource使用

2. 設定 ReportDataSource 物件的 DataSource ID
    我使用Switch 語法, 依RadioButtonList1.SelectedItem.ToString()指定不同的ObjectDataSource Name給DataSource ID

3. rds.Name  則是指 RDLC 裡資料集的名稱, 在本例我都是一樣的DataSet1名稱

4. 把 ReportViewer1 狀態重設, 因為我看網路上的範例, 在變更ReportViewer的設定前都要進行重設.

5. 設定 ReportViewer 裡 RDLC 的路徑及名稱
ReportViewer1.LocalReport.ReportPath = RadioButtonList1.SelectedValue;
因為我們把RDLC路徑及名稱事先寫在 RadioButtonList1各 Item的Value裡, 所以這裡只用一句語法就搞定.

6. 設定ReportViewer 的 DataSource
ReportViewer1.LocalReport.DataSources.Add(rds);
把剛剛步驟1建立的ReportDataSource 物件, 加到ReportViewer1的 DataSource裡

7. 傳"薪資年月"的參數到 ReportViewer , 並執行預覽
ReportParameter[] para = new ReportParameter[1]; 
para[0] = new ReportParameter("yearmonth",DropDownList1.SelectedValue);            this.ReportViewer1.LocalReport.SetParameters(para);
                        

以上完畢!


相簿設定
標籤設定
相簿狀態