我的名字是 Ed,我需要从 ReportView dinamic 加载图像。我该怎么做?我使用 Windows 窗体、c# 3.0 和 linq to sql,我需要将图像加载到我的动态报告中。
谢谢。
我的名字是 Ed,我需要从 ReportView dinamic 加载图像。我该怎么做?我使用 Windows 窗体、c# 3.0 和 linq to sql,我需要将图像加载到我的动态报告中。
谢谢。
我假设您正在使用 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 文件。
这个答案非常有帮助(它让我过去在我的报告中出现了一些“损坏的图像”框),但有点误导。
严格来说,“图像”(实际上是一个字节数组)不是 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;
}
}
简短的回答是您不能这样做,至少不能使用内置的报表查看器功能。
但是,如果您确定要这样做,您可以尝试动态创建 RDLC 文件。如果您动态创建 RDLC 文件,您可以动态地将图像添加到报告中。
您可以在此处找到一些有关如何动态创建 RDLC 文件的示例代码。