c# 报表练习笔记二——父子报表 + 分组 + 图片
rdlc里面,如果删除了组属性,行的属性没有分组的话,此行仅显示一行。只有行为组的情况下,行才会多行显示数据。
父子报表的重点在两个报表的数据关联上。
♠:在子报表属性的参数中加入一个参数“姓名”,参数值=“=Fields!姓名.Value”。
♠:打开子报表,在报表属性中加入一个报表参数“姓名”,这个参数与上一步设置的参数同名。
♠:在子报表中加入表格控件,表的属性中的筛选器加入“=Fields!姓名.Value”=“=Parameters!姓名.Value”。
界面的后台数据绑定关键在事件SubreportProcessing的赋值,是对子报表数据的绑定:
using (var ds = new DataSet()) { ds.ReadXml("ReportSubRep\\SubResult.xml"); reportViewer1.ProcessingMode = ProcessingMode.Local; reportViewer1.LocalReport.ReportPath = "ReportSubRep\\ReportSubRep.rdlc"; ReportDataSource dataSource1 = new ReportDataSource("dsMain", ds.Tables["Main"]); ReportDataSource dataSource2 = new ReportDataSource("dsDetail", ds.Tables["Detail"]); reportViewer1.LocalReport.SubreportProcessing += (a, b) => b.DataSources.Add(dataSource2); reportViewer1.LocalReport.DataSources.Add(dataSource1); reportViewer1.RefreshReport(); }
分组可以理解成将数据按某个关键字分组,类似与Group<string,List<object>>的结构,分组之后,相同的属性值就只有一个结果。分组+父子报表可以做出以下效果:
rdlc添加图片,
在rdlc的编辑中,从工具栏拖动“图像”到表格,“图像源...”有三个选项,“嵌入”、“外部”、“数据库”。嵌入比较简单,导入一个图像即可。“外部”则可以在显示报表的客户端指定图像的来源,图像已经生成,存储在本地或者网络。“数据库”则可以传递Base64String格式的图像数据进来。
“外部”:选择外部图像时,可以在报表中新建一个参数,例如LogoUrl,将"外部"图像的"使用此图像"指向这个参数。在cs文件里面往rdlc绑定数据时注意,加上这两行代码,绑定图像数据源,可以绑定网络数据源。
reportViewer1.LocalReport.EnableExternalImages = true; reportViewer1.LocalReport.SetParameters(new ReportParameter("LogoUrl", "file:///" + AppDomain.CurrentDomain.BaseDirectory + "Report\\logo.png"));
“数据库”:当图片在内存中,没必要保存到硬盘中,可以选择这种。有几点主要的:
1.将生成的bitmap转成Base64String,
//Bitmap转byte[] public static byte[] BitmapToBytes(this Bitmap bitmap) { if (bitmap == null) return null; using (MemoryStream ms = new MemoryStream()) { try { bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); //Bitmap.Save(ms, Bitmap.RawFormat); byte[] byteImage = new Byte[ms.Length]; byteImage = ms.ToArray(); return byteImage; } catch (Exception) { throw; } } } public static string BitmapToBase64String(this Bitmap bitmap) { return Convert.ToBase64String(BitmapToBytes(bitmap)); }
2.“数据库”图像时,上步中的bitmap转bytes时,格式为Bmp,所以数据库图像的“使用此MIME类型”选择“image/bmp”。
3.将bitmap.BitmapToBase64String()传递给图像对应的表格字段就可以了。
补充一点,生成一个bitmap可以用以下代码:
Point[] points = GetPoints(xy).ToArray(); Bitmap res = new Bitmap(200, 200); Graphics g = Graphics.FromImage(res); g.Clear(Color.White); g.DrawLines(Pens.Red, points);
留文,填充中...