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);

留文,填充中...

posted @ 2013-03-15 17:30  脸谱匠  阅读(1486)  评论(0编辑  收藏  举报