介紹
最近項目中要用到報表的分組顯示,覺得rdlc報表功能比較強大,就嘗試用它來實現一下。實現方式也是有很多種,下面一一介紹。
創建分組後的數據庫表
自己計算相對麻煩些,可以在數據庫先創建一張表每班彙總信息(EveryTotalInfo),然後創建一個與該表對應的數據集xxx.xsd文件,在數據集中添加該表需要展示的哪些字段(注意字段類型必須與數據庫中的一致):
下面的適配器中添加一個帶時間參數(@getTime)的獲取方法,注意類型是日期時間類型(DateTime):
然後打開rdlc文件,在“報表數據”頁面新建數據集:
數據源類型選擇數據庫:
數據庫模型選擇:
在選擇數據庫對象時,把我們新創建的表EveryTotalInfo選中:
點擊完成後,會生成名爲“DataSet1”(名字可以自己改)的數據集,屬性如下:
在“工具箱”頁面拖入一個“表”控件:
這時表文本里面就可以添加數據庫對應表的字段了:
最後表的樣式如下圖所示:
我們代碼中先計算好分組後的數據,然後插入到EveryTotalInfo表中,要顯示的時候,只需給EveryTotalInfoTableAdapter適配器傳入表集合和參數即可:
this.everyTotalInfoTableAdapter.Fill(byGsDataSet1.EveryTotalInfo, time);
this.reportViewer1.RefreshReport();
這裏的time就是之前定義的DateTime類型的@getTime參數,其作爲查詢條件,展示表中的數據,下面是展示的結果:
看到這裏,實際上數據庫中EveryTotalInfo表只是起到中間存放的作用,那麼我們可不可以不創建表,直接代碼中計算後添加到數據集當中呢?答案是肯定的。下面來介紹第二種方法。
不使用數據庫表數據展示
不需要先在數據庫中建表,直接在數據集xxx.xsd文件中添加展示字段:
和剛纔一樣,在rlcd文件中關聯數據集,做好展示頁面:
那麼代碼中如何更新這個數據集的內容呢?實際上就是取代這個與rlcd關聯的數據庫(比如名爲ByGsDataSet2):
// 創建新數據表
ByGsDataSet2 ds = new ByGsDataSet2();
…
// 有多少張卡添加多少行數據
for (int i = 0; i < cards.Count; i++)
{
DataRow newRow = ds.CardStatis.NewRow();
newRow["CardNumber"] = cardNum;
…
ds.CardStatis.Rows.Add(newRow);
}
…
Microsoft.Reporting.WinForms.ReportDataSource dataSource = new Microsoft.Reporting.WinForms.ReportDataSource("DataSet3", ds.Tables["CardStatis"]);
if (this.reportViewer1.LocalReport.DataSources.Count > 1) // 重新添加數據
this.reportViewer1.LocalReport.DataSources.RemoveAt(1);
this.reportViewer1.LocalReport.DataSources.Add(dataSource);
在添加數據集的時候,要注意“重新添加數據”的代碼,這是判斷數據集是否已經存在了,如果存在就先移除再添加。如果沒有這行代碼,第一次展示時沒問題,如果數據變動後重新計算再添加就會出錯的。
最後展示結果如下:
使用rdlc自帶分組功能
在要分組的行上右鍵選擇“添加組”->“父組…”:
然後添加分組依據的表字段(這裏以加氣類型爲依據):
組內詳細信息裏面也需要有個排列順序,這裏按槍號排序,選中剛纔的父組行,右鍵“添加組”->“子組…”:
然後添加分組依據的表字段(這裏選擇槍號對於的數據庫字段):
我們要按照槍號由小到大進行排序顯示的話,右鍵報表,選擇“Tablix屬性”:
然後選中排序依據的字段,順序是從A到Z:
這樣運行報表效果:
可以看到展示數據已經按照不同的品類進行分組顯示了,這裏只有個總計,如果我們還需要在組內進行小計該怎麼辦呢?
要在組內進行小計,需要右鍵在組內添加行:
然後寫上彙總公式:=Sum(Fields!FinishTotal.Value-Fields!StartTotal.Value)
注意最後總計的行一定要放在組外,最終樣式如下:
再運行一下程序看效果:
這下組內小計和組外總計就全有了
不使用數據庫表數據分組
如果自己計算的數據集,也需要添加分組怎麼辦呢?比如剛纔的“員工售氣統計表”。首先在數據集xxx.xsd文件中添加分組依據字段(按品類):
然後在rdlc文件中添加展示內容:
沒有剛添加的“GasType”字段怎麼辦,可以在“報表數據”頁面刷新一下對應的數據集:
如果還不行,就來強硬的,修改rdlc源代碼,在對應的數據集名稱下直接添加新插入的字段:
這時再重新打開rdlc文件,就可以看到新添加的字段了:
這時展示的報表並沒有分組:
分組操作跟上面講的一樣,右鍵選擇“添加組”->“父組…”,這次分組依據選擇卡號:
再運行顯示如下:
問題是卡號和名字肯定是一一對應的,卡號分組了,名字就沒必要再重複顯示了。在品類行上再次添加行父組:
這次分組依據選擇姓名,組效果如下圖:
再次運行後:
這次卡號和名字都唯一的,只是文字不居中啊,強迫症沒辦法,在rdlc文本框中右鍵“文本框屬性”:
在對齊項中,看到水平是居中的,把垂直也改爲“垂直居中”:
把分組展示的文本框都這樣修改後,再次運行:
這次看着舒服多了。。。