C#的rdlc報表分組彙總學習

介紹

最近項目中要用到報表的分組顯示,覺得rdlc報表功能比較強大,就嘗試用它來實現一下。實現方式也是有很多種,下面一一介紹。

創建分組後的數據庫表

自己計算相對麻煩些,可以在數據庫先創建一張表每班彙總信息(EveryTotalInfo),然後創建一個與該表對應的數據集xxx.xsd文件,在數據集中添加該表需要展示的哪些字段(注意字段類型必須與數據庫中的一致):
數據集表
下面的適配器中添加一個帶時間參數(@getTime)的獲取方法,注意類型是日期時間類型(DateTime):
參數類型
然後打開rdlc文件,在“報表數據”頁面新建數據集:
新建數據集
數據源類型選擇數據庫:
選擇數據庫
數據庫模型選擇:
模型選擇
在選擇數據庫對象時,把我們新創建的表EveryTotalInfo選中:
表選擇
點擊完成後,會生成名爲“DataSet1”(名字可以自己改)的數據集,屬性如下:
屬性
在“工具箱”頁面拖入一個“表”控件:
插入表
這時表文本里面就可以添加數據庫對應表的字段了:
顯示對應字段
最後表的樣式如下圖所示:
完整表結構
我們代碼中先計算好分組後的數據,然後插入到EveryTotalInfo表中,要顯示的時候,只需給EveryTotalInfoTableAdapter適配器傳入表集合和參數即可:
this.everyTotalInfoTableAdapter.Fill(byGsDataSet1.EveryTotalInfo, time);
this.reportViewer1.RefreshReport();
這裏的time就是之前定義的DateTime類型的@getTime參數,其作爲查詢條件,展示表中的數據,下面是展示的結果:
展示樣式1
看到這裏,實際上數據庫中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);

在添加數據集的時候,要注意“重新添加數據”的代碼,這是判斷數據集是否已經存在了,如果存在就先移除再添加。如果沒有這行代碼,第一次展示時沒問題,如果數據變動後重新計算再添加就會出錯的。
最後展示結果如下:
展示樣式2

使用rdlc自帶分組功能

在要分組的行上右鍵選擇“添加組”->“父組…”:
添加父組
然後添加分組依據的表字段(這裏以加氣類型爲依據):
分組依據
組內詳細信息裏面也需要有個排列順序,這裏按槍號排序,選中剛纔的父組行,右鍵“添加組”->“子組…”:
添加子組
然後添加分組依據的表字段(這裏選擇槍號對於的數據庫字段):
分組依據
我們要按照槍號由小到大進行排序顯示的話,右鍵報表,選擇“Tablix屬性”:
表屬性
然後選中排序依據的字段,順序是從A到Z:
排序
這樣運行報表效果:
展示樣式3
可以看到展示數據已經按照不同的品類進行分組顯示了,這裏只有個總計,如果我們還需要在組內進行小計該怎麼辦呢?
要在組內進行小計,需要右鍵在組內添加行:
插入組內行
然後寫上彙總公式:=Sum(Fields!FinishTotal.Value-Fields!StartTotal.Value)
小計公式
注意最後總計的行一定要放在組外,最終樣式如下:
最終樣式
再運行一下程序看效果:
展示樣式4
這下組內小計和組外總計就全有了

不使用數據庫表數據分組

如果自己計算的數據集,也需要添加分組怎麼辦呢?比如剛纔的“員工售氣統計表”。首先在數據集xxx.xsd文件中添加分組依據字段(按品類):
數據集增加字段
然後在rdlc文件中添加展示內容:
展示報表
沒有剛添加的“GasType”字段怎麼辦,可以在“報表數據”頁面刷新一下對應的數據集:
數據集刷新
如果還不行,就來強硬的,修改rdlc源代碼,在對應的數據集名稱下直接添加新插入的字段:
手動修改
這時再重新打開rdlc文件,就可以看到新添加的字段了:
新加字段出現
這時展示的報表並沒有分組:
未分組展示
分組操作跟上面講的一樣,右鍵選擇“添加組”->“父組…”,這次分組依據選擇卡號:
增加父組
再運行顯示如下:
分組顯示
問題是卡號和名字肯定是一一對應的,卡號分組了,名字就沒必要再重複顯示了。在品類行上再次添加行父組:
再增加父組
這次分組依據選擇姓名,組效果如下圖:
組效果圖
再次運行後:
分組顯示
這次卡號和名字都唯一的,只是文字不居中啊,強迫症沒辦法,在rdlc文本框中右鍵“文本框屬性”:
文本屬性
在對齊項中,看到水平是居中的,把垂直也改爲“垂直居中”:
選擇居中對齊
把分組展示的文本框都這樣修改後,再次運行:
對齊顯示
這次看着舒服多了。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章