在运行时动态更改Crystal Report中的图像

时间:2020-03-06 14:40:24  来源:igfitidea点击:

我正在使用VisualStudio 2005附带的Crystal Reports。我希望通过建立图像文件的路径,然后在报表上显示该图像来更改运行时报表上显示的图像。

有人能够使用此版本的Crystal Reports完成此操作吗?

解决方案

尝试结合使用包含图像路径的参数和此页面上的教程:http://www.idautomation.com/crystal/streaming_crystal.html

然后在步骤8中,使用参数代替硬编码路径。

我也有这个问题(并投了票)!

[我已经找到了通过CObject属性使用字节数组的解决方案,请参见单独的答案。将此答案留在此处以供参考...]

这是我所看到的建议(但是我在C#-2005和C#-2008中都尝试并失败了)。

  • 选择一个目录,然后在其中放置一个BMP(例如," C:\ Temp \ image.bmp")。
  • 在CR-Designer中a)右键单击->插入-> OLE对象... b)选择"从文件创建" c)选中"链接"复选框d)浏览并选择在步骤1中定义的bmp。确定f)将图像放在表格上。
  • 在运行时以C#代码覆盖/更新图像。从理论上讲,由于我们插入了指向图像文件的链接,因此刷新表单后将对其进行更新。

我没有这种方法的运气。该图像在我第一次设计表单时出现(第2步)。但是在运行时,该映像不会为我更新。从这一点开始,事情变得很奇怪。似乎CR缓存了某种不会消失的图像。我可以在CR-Designer中删除OLE对象链接,但是如果重新创建它,我总是会得到一个与原始图像大小相同的黑盒(即使我更改了image.bmp的大小)。

在工作中,我们通过将图像作为数据表的字段推送到报表中来实现此目的。它不是很漂亮,但是可以完成工作。当然,此解决方案要求我们通过数据集将数据推送到报表中。我一直觉得这充其量是hack。我真的希望CR可以使用图像参数。

编辑:值得注意的是,如果要将Crystal报表绑定到普通的旧对象,则要公开byte []属性以使报表将其视为图像。

就像乔希(Josh)所说的那样。我们将不得不使用数据集推送图像。或者,将映像一次放入数据库表中,并使用子报表多次将其提取。

我终于用Josh在这里发布的byte []技巧找到了解决方案。

如果我们使用的是普通的老式CObject来填充Crystal Reports,则适用此解决方案(请参见http://www.aspfree.com/c/a/C-Sharp/Crystal-Reports-for-Visual-Studio-2005-in- CSharp /,以获取有关此方法的信息)。

在Cclass中,插入以下代码:

private static byte[] m_Bitmap = null;

public byte[] Bitmap
{
   get
   {
      FileStream fs = new FileStream(bitmapPath, FileMode.Open);
      BinaryReader br = new BinaryReader(fs);
      int length = (int)br.BaseStream.Length;
      m_Bitmap = new byte[length];
      m_Bitmap = br.ReadBytes(length);
      br.Close();
      fs.Close();
      return m_Bitmap;
   }
}

现在,使用"验证数据库"选项更新CR中的CObject映射。然后,我们应该将Bitmap属性视为CR字段。只需将其拖到窗体上即可。它将是IBlobFieldObject类型。运行时,我们应该看到图像。

我们还可以使用条件公式来设置图像的位置。请参见Crystal Reports:动态图像。