0

我的名字是 Ed,我需要从 ReportView dinamic 加载图像。我该怎么做?我使用 Windows 窗体、c# 3.0 和 linq to sql,我需要将图像加载到我的动态报告中。

谢谢。

4

3 回答 3

2

我假设您正在使用 C# 中的 Microsoft Report Viewer 组件,并且您希望动态地将图像添加到报告中。

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

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

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

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

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

限制是报告中的图像必须是固定大小的。您必须事先重新采样图像以适应它们,或者按照 Jon 的建议,为报告动态创建 RDLC 文件。

于 2009-05-05T18:53:53.380 回答
2

这个答案非常有帮助(它让我过去在我的报告中出现了一些“损坏的图像”框),但有点误导。

严格来说,“图像”(实际上是一个字节数组)不是 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;
    }
}
于 2010-07-28T20:59:11.007 回答
-1

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

但是,如果您确定要这样做,您可以尝试动态创建 RDLC 文件。如果您动态创建 RDLC 文件,您可以动态地将图像添加到报告中。

您可以在此处找到一些有关如何动态创建 RDLC 文件的示例代码。

于 2009-05-05T18:17:46.103 回答