ReportViewer 矩陣控件
今天遇到一個奇葩的需求,要把一個原來是豎着排列的A4紙報表,改成A4橫着打印,一張紙上要打印4個報表,這4個報表是按從左到右依次來的。
即從這樣的報表:
變成這樣子:
第一種大家應該都會,不會的也知道...在報表上拖個table或者list控件就完事了,自動豎着來...妥妥的。
對於第二種,不知道Matrix控件的着實有點小難,即使知道用Matrix可以實現卻從來沒用過這玩意兒也的確頭大,畢竟不知道對應的原理,要摸索老半天。
這裏就針對這個需求,記錄一下矩陣控件的簡單用法:
1.首先呢,在數據庫建個簡單的student表,只有倆字段:
2.然後在VS中新建一個winform項目,拖個reportviewer控件上去,再新建一個報表rdlc文件,一個xsd數據集文件
,在窗體的報表控件上指定報表rdlc文件;
3.爲xsd文件指定數據源,就是剛剛新建的學生表:
4.爲rdlc文件指定數據源:
vs2012的在左邊...
5.爲報表綁定數據源實例
:
6.設計報表rdlc文件,從報表工具箱拖個矩陣出來:
再在數據方塊裏放一個list控件:
調整下矩陣大小,右下角數據那一塊儘量大一點,然後在list控件里加一個矩形控件boderStyle選擇solid,然後加4個textbox,兩個用來作title,兩個顯示數據:
運行一下,不用說,現在肯定是豎着來顯示的:
那怎麼設置才能顯示成從左到右每行兩個呢?
對於矩陣控件:列和行又代表什麼意思呢?
實際上很簡單:行和列代表當前報表文件綁定的數據源裏的兩個字段,報表會自動根據這個列和行字段,來顯示不同的擴張樣式。說不明白啊。。。下面看操作就知道:
我們需要在數據庫多加3個字段:orderIndex(爲方便操作增加的自增長字段,oracle有rownum可以不必加),rowIndex,columnIndex:
--增加自增長列
alter table student add orderIndex numeric(5,0) identity(1,1);
--列索引
alter table student add rowIndex char(10) null;
--行索引
alter table student add columnIndex char(10) null;
執行完上面的,再初始化下3個字段:declare
@rowIndex int=1, --從1開始 1,1,2,2,3,3,...
@columnIndex int=1, --從1開始 1,2,1,2,1,2...
@loop int=1,--一行一行執行
@maxNum int --表記錄行數
select @maxNum=COUNT(*) from student;
while @loop<=@maxNum
begin
update t set t.rowIndex=@rowIndex,t.columnIndex=@columnIndex
from student t
where t.orderIndex=@loop;
if(@columnIndex=1)
set @columnIndex=@columnIndex+1
else
set @columnIndex=@columnIndex-1
if((@loop%2)=0)
set @rowIndex=@rowIndex+1
set @loop=@loop+1;
end
最後表記錄變成:重點是rowIndex,columnIndex兩個字段的值,不明白仔細研究下吧,想通了很簡單:
把矩陣的行綁定rowIndex字段,列綁定columnIndex(注意報表寬度要容納兩個矩陣寬度以上);
運行看下效果:
這樣就已經實現了功能。
實際上這只是一個簡單的矩陣,還有複雜矩陣,需要自己添加矩陣列組、行組的...
不過再複雜都可以藉此例來參考~