在运行时动态更改Crystal Report中的图像
我正在使用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:动态图像。