rdlc 子報表
建立主報表所要的資料集,並命名為MainDataSet,並給予如下圖的五個表格名稱
建立主報表Main.rdlc,在該報表使用剛才的資料集當作資料來源,並建立資料集命名為maindata
建立好所有欄位
子報表開始
主報表(Main.rdlc)只顯示kind與cname,其餘資訊將在子報表顯示
到主報表(Main.rdlc)在想呈現子報表的文字框中右鍵-->插入--->子報表
建立子報表並命名為SubReport.rdlc
到主報表(Main.rdlc)在想呈現子報表的文字框中右鍵-->插入--->子報表
完成後該輸入光會顯示<子報表>
右鍵--->子報表屬性
在"將此報表當成子報表(U):"地下的空白處輸入子報表名稱(不用加rdlc)
在選擇參數--->加入,將要帶給子報表的值輸入(名稱與子報表要接收時的名稱需一樣)
-------------------------------------------------------------------------------------------------------------------
以下兩步驟可省略 (主報表不須加入參數仍可帶給子報表 rdlc的改變?)
在主報表的報表資料-->參數右鍵-->加入參數
輸入要帶給子報表的參數(名稱與上述需相同)
(絕對要勾"允許Null值)
-------------------------------------------------------------------------------------------------------------------
完成如下
主報表設計部分完成畫面
建立子報表所要的資料集,並命名為SubDataSet,並給予如下圖的五個表格名稱
子報表設定資料來源(SubDataSet)與資料集(命名為sundata)
將子報表的表格設計好
子報表-->左側的報表資料中參數右鍵-->加入參數
將所會收到的參數皆須加入
完成如下圖左側,子報表設計部分到此完成
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輸出會發現顯示如下
而從執行次數可看出,他是每列發生一次事件
因此不用擔心資料會放錯位置(可與上方主報表輸出畫面對照)
若是給予子報表的參數在主報表是外部給予,則在主報表中想呈現子報表的文字框中右鍵-->插入--->子報表屬性,值得部分給予要加上"@",在運算式可看出取得值是不一樣的
傳遞給子報表自己的值
傳遞給子報表外部給予的參數
留言
張貼留言