将图像动态加载到ReportViewer

时间:2009-04-24 15:36:27

标签: c# linq reportviewer

我的名字是Ed,我需要从ReportView dinamic加载图片。我能做到这一点吗? 我工作的Windows窗体,c#3.0和linq到sql,我需要加载图像到我的报告dinamic。

感谢。

3 个答案:

答案 0 :(得分:2)

我假设您正在使用C#中的Microsoft Report Viewer Component,并且您想要动态地将图像添加到报表中。

这当然是可能的,您需要创建一个带有byte []属性的类,该属性表示序列化的位图。

class ReportImage {
    public byte[] Image {get;set;}

    // Other stuff here if you want...
}

将此对象的属性设置为Bitmap的每像素24位序列化版本(即将位图保存到MemoryStream,然后调用MemoryStream.ToArray())。您必须每像素使用24位,并且保存到的格式必须为BMP,这在报告查看器中似乎是必需的。

然后,您可以绑定到对象数据源(有关绑定到对象的详细信息,请参阅MSDN documentation,另请参阅示例here)。使用“图像”项在报告中显示图像。

限制是报告中的图像必须是固定大小。您必须事先对图像进行重新取样以使其适合,或者如Jon建议的那样,为报告动态创建RDLC文件。

答案 1 :(得分:2)

This answer非常有帮助(它让我过去在我的报告中有一些“破碎图像”框),但有点误导。

严格来说,并非要求“图像”(实际上是字节数组)是BMP格式。在测试项目中,我能够从磁盘读取jpeg文件(即File.ReadAllBytes(filename);)并将生成的字节数组添加到“rptrow”列表中的byte []属性中(其中rptrow是表示的对象)报告表中一行的所有数据)。报告上的图像将MIMEType设置为“image / jpeg”,并将Source属性设置为“Database”。我还注意到,只要指定了某些东西,我使用的MIMEType并不重要(即不是空白)。

我很匆忙,所以我甚至没有考虑检查它必须是24bpp图像的声明。

简化rptobj:

public class rptobj
{
    public string FileName { get; set; }
    public byte[] Photo { get; set; }

    private List<rptobj> photos;
    public List<rptobj> GetList()
    {
        if (photos == null)
        {
            photos = LoadPhotos();
        }
        return photos;
    }

    private List<rptobj> LoadPhotos()
    {
        var rslt = new List<rptobj>();
        byte[] rawData;
        var path = HttpContext.Current.Server.MapPath(@"~\images");

        DirectoryInfo di = new DirectoryInfo(path);
        FileSystemInfo[] fis = di.GetFileSystemInfos("*.jpg");

        foreach(var fi in fis){
            rawData = File.ReadAllBytes(string.Format(@"{0}\{1}", path, fi.Name ));
            rslt.Add(new rptobj() { Photo = rawData, FileName = fi.Name });
        }
        return rslt;
    }
}

答案 2 :(得分:-1)

简短的回答是你不能这样做,至少不能使用内置的报告查看器功能。

但是,如果您确定要执行此操作,则可以尝试动态创建RDLC文件。如果动态创建RDLC文件,则可以动态地将图像添加到报告中。

您可以找到有关如何动态创建RDLC文件的示例代码here