RDLC学习的记录和分享。
更多详细,可参照官网:
https://docs.microsoft.com/zh-cn/sql/reporting-services/report-design/planning-a-report-report-builder?view=sql-server-2017
一、运行环境
开发工具:vs2015(日语版的,但汉字大家应该都能看懂)
二、开发步骤
第一步,新建winform窗体;
第二步,新建类DataRecord.cs,作为RDLC文件的数据源。
此步骤后一定要编译下程序,不然后面生成数据源时找不到目标文件。
也可使用数据集*.xsd作为数据源,这时候就不用编译程序了。
第三步,利用向导添加Report1.rdlc报表文件,设计此报表文件;
第四步,在窗体上添加ReportViewer控件作为呈现报表的容器;
第五步,在窗体上添加按钮,点击此按钮时更新报表数据。
三、详细步骤(大量截图)
⚪ 追加数据源类DataRecord.cs
⚪ 追加报表文件
⚪ 设计报表文件
①追加四角形,类似于Panel的功能,如果多控件需要调整位置的话,加四角形会省力很多。
②追加表格,绑定数据源
此时在Properties\DataSources目录下生成了DataRecord.datasource文件。
名前设置的名字,类似于Report1.rdlc文件内部的变量名,在Form层最终绑定数据的时候会用到。
③这个时候若更改了数据源DataRecord.cs,则需要手动更新Report1.rdlc绑定的字段。方法如下:
更新后的DataRecord.cs
全局检索DataRecord,在检索结果里面选择Report1.rdlc,双击打开对应的xml文件。
xml文件如下,需要将变动的字段更新,保存即可。
(DataSets的内容是此RDLC绑定的所有数据源,DataSet是某一数据源)
④若单纯的显示数据的话,则选择字段进行绑定就OK。红框选中部分表示重复显示。
⑤若需要对数据源进行Group统计,则删除④中红框选中的行,新追加普通行。
追加行Group
追加列Group
整理Table如下
为单元格添加统计表达式
(此处的截图已经设置了字体和边框线)
上面框选部分的表达式均相同。
Region和ClassNode交叉处单元格 Group By Region和ClassNo
行合计 只Group By Region
列合计 只Group By ClassNo
行合计和列合计交叉处单元格没有Croup条件
累计的表达式为 =RunningValue(Fields!Name.Value, Count, Nothing)
ClassNo若要显示在下面,则删除第一行时,只删除行,不要删除Group条件
⑥添加ReportViewer和Button,绑定数据
添加ReportViewer后要绑定一下Report,如图
Button的Click事件:
private void button1_Click(object sender, EventArgs e)
{
List<DataRecord> dataSource = new List<DataRecord>();
Random random = new Random();
DataRecord temp;
//Class Index
for (int classIndex = 1; classIndex <= 3; classIndex++)
{
//Student Index
for (int studentIndex = 1; studentIndex <= 10; studentIndex++)
{
temp = new DataRecord();
temp.ClassNo = classIndex + "班";
temp.Name = "Name" + studentIndex;
temp.Score = random.Next(0, 100);
temp.Region = GetRegion(temp.Score);
dataSource.Add(temp);
}
}
this.reportViewer1.LocalReport.DataSources.Clear();
this.reportViewer1.LocalReport.ReportEmbeddedResource = "WindowsFormsTesst.Report1.rdlc";
this.reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataRecord", dataSource));
this.reportViewer1.RefreshReport();
}
private string GetRegion(int score)
{
string region = string.Empty;
if (0 <= score && score <= 10)
region = " 0 ~ 10";
else if (10 < score && score <= 20)
region = "11 ~ 20";
else if (20 < score && score <= 30)
region = "21 ~ 30";
else if (30 < score && score <= 40)
region = "31 ~ 40";
else if (40 < score && score <= 50)
region = "41 ~ 50";
else if (50 < score && score <= 60)
region = "51 ~ 60";
else if (60 < score && score <= 70)
region = "61 ~ 70";
else if (70 < score && score <= 80)
region = "71 ~ 80";
else if (80 < score && score <= 90)
region = "81 ~ 90";
else if (90 < score && score <= 100)
region = "91 ~ 100";
return region;
}
⑦运行之前,设置一下Report1.rdlc的属性,Copy到编译路径下,不然会报找不到文件的错
最终运行效果如下(边框线粗的地方,可能时边框线设置重复,也可能是ReportViewer本身显示的问题)
四、其他
⚪设置打印时Page设定信息,代码如下
PageSettings newPage = new PageSettings();
newPage.Margins = new System.Drawing.Printing.Margins(40, 40, 20, 20);
newPage.PaperSize = new PaperSize("A3 297x420mm", 1169, 1654);
newPage.PaperSize.RawKind = 8;
newPage.Landscape = true;
this.reportViewer1.SetPageSettings(newPage);
也可通过菜单栏设置,如下图:
⚪每一个单元格其实是一个TextBox,并且有对应的名字。
可以通过取得TextBox的值来取得同一行其他字段的值。
Textbox2的表达式:=ReportItems!Region.Value
运行效果如下图:
⚪实现换页的两种方式
利用Table的换页
利用四角形的换页
⚪多个数据源的追加(选中RDLC文件)