rdlc 子報表

建立主報表所要的資料集,並命名為MainDataSet,並給予如下圖的五個表格名稱







建立主報表Main.rdlc,在該報表使用剛才的資料集當作資料來源,並建立資料集命名為maindata





建立好所有欄位

到此步驟為止主報表已完成,執行並給予資料後結果會如下圖

子報表開始

主報表(Main.rdlc)只顯示kind與cname,其餘資訊將在子報表顯示

建立子報表並命名為SubReport.rdlc



到主報表(Main.rdlc)在想呈現子報表的文字框中右鍵-->插入--->子報表

完成後該輸入光會顯示<子報表>
右鍵--->子報表屬性


在"將此報表當成子報表(U):"地下的空白處輸入子報表名稱(不用加rdlc)
在選擇參數--->加入,將要帶給子報表的值輸入(名稱與子報表要接收時的名稱需一樣)




-------------------------------------------------------------------------------------------------------------------
以下兩步驟可省略 (主報表不須加入參數仍可帶給子報表  rdlc的改變?)
在主報表的報表資料-->參數右鍵-->加入參數

輸入要帶給子報表的參數(名稱與上述需相同)
(絕對要勾"允許Null值)

-------------------------------------------------------------------------------------------------------------------

完成如下


主報表設計部分完成畫面





建立子報表所要的資料集,並命名為SubDataSet,並給予如下圖的五個表格名稱


子報表設定資料來源(SubDataSet)與資料集(命名為sundata)


將子報表的表格設計好


子報表-->左側的報表資料中參數右鍵-->加入參數
將所會收到的參數皆須加入


完成如下圖左側,子報表設計部分到此完成

在cs中程式碼如下

using System.Data;
using System.Data.SqlClient;
using Microsoft.Reporting.WebForms;

 int count = 1;    //用來看執行幾次事件,全域變數

  if (!IsPostBack)
            {
                連線與SQL語法省略,有需要可至之前的文章查詢

                從資料庫獲得資料並放入表格中後
                 ReportViewer1.LocalReport.ReportPath = "Main.rdlc";
                ReportViewer1.LocalReport.DataSources.Clear();
                 ReportDataSource rds = new ReportDataSource("maindata", dt);
                ReportViewer1.LocalReport.DataSources.Add(rds);
                ReportViewer1.Visible = true;
              // 子報表事件
                ReportViewer1.LocalReport.SubreportProcessing += new                             SubreportProcessingEventHandler(subReportProcessing);

               ReportViewer1.LocalReport.Refresh();
                }


 void subReportProcessing(object sender, SubreportProcessingEventArgs e)
        {
           //取得資料 e.Parameters["給子報表的參數名稱"].
            string kind = e.Parameters["kind"].Values[0];     //從第0筆開始讀
            string acceptCount = e.Parameters["acceptCount"].Values[0];
            string wait_time_avg = e.Parameters["wait_time_avg"].Values[0];
            string work_time_avg = e.Parameters["work_time_avg"].Values[0];
         
           建立表格並給予名稱
            DataTable dt = new DataTable();
            dt.Columns.Add("kind");
            dt.Columns.Add("acceptCount");
            dt.Columns.Add("wait_time_avg");
            dt.Columns.Add("work_time_avg");
            dt.Columns.Add("run_count");
            將資料放入列
            DataRow dr = dt.NewRow();
            dr["kind"] = kind.Trim();
            dr["acceptCount"] = acceptCount.Trim();
            dr["wait_time_avg"] = wait_time_avg.Trim();
           dr["work_time_avg"] = work_time_avg.Trim();
            dr["run_count"] = count++;                 //用來看執行幾次事件
            dt.Rows.Add(dr);                       //將列放入表格
            e.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource("subdata", dt));
        }


若在subReportProcessing事件中,將kind輸出會發現顯示如下

而從執行次數可看出,他是每列發生一次事件
因此不用擔心資料會放錯位置(可與上方主報表輸出畫面對照)


若是給予子報表的參數在主報表是外部給予,則在主報表中想呈現子報表的文字框中右鍵-->插入--->子報表屬性,值得部分給予要加上"@",在運算式可看出取得值是不一樣的

傳遞給子報表自己的值

傳遞給子報表外部給予的參數




留言

這個網誌中的熱門文章

SQL SEVER備份與還原遭遇問題

asp.net頁面間傳值