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


我正在使用VisualStudio 2005附带的Crystal Reports。我想在运行时更改报表上显示的图像,理想情况是通过构建图像文件的路径,然后在报表上显示该图像。

有没有人能够使用此版本的Crystal Reports实现此目的?


3089
2017-09-24 16:36


起源



答案:


在工作中,我们通过将图像作为数据表的字段推送到报表中来完成此操作。它不漂亮,但它完成了工作。当然,此解决方案要求您通过DataSet将数据推送到报表中。我一直认为这是一个充其量的黑客。我真的希望图像参数是CR的可能性。

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


7
2018-02-21 03:45



我按照www.aspfree.com/c/a/C-Sharp/Crystal-Reports-for-Visual-Studio-2005-in-CSharp/使用C#类。我有一个包含数百个字段的复杂的自定义绘制报告。我看不到从这里到那里的好路。我看了一下:codeguru.com/csharp/.net/net_general/toolsand3rdparty/article.php/c13253。 - e-holder
如果要将Crystal Report绑定到普通旧对象,只需公开byte []属性。 CR会将其视为图像。 - Josh Bush
找到了!我曾经尝试过“Bitmap”属性,但是在我已经完成的阅读中没有遇到byte [] CR技巧。 - e-holder
@JoshBush你能解释一下这是如何在VB.NET中完成的吗? - Keith
@JoshBush我从命令行打印报告,图片没有出现,我想我错过了什么。 - Eli Ekstein


答案:


在工作中,我们通过将图像作为数据表的字段推送到报表中来完成此操作。它不漂亮,但它完成了工作。当然,此解决方案要求您通过DataSet将数据推送到报表中。我一直认为这是一个充其量的黑客。我真的希望图像参数是CR的可能性。

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


7
2018-02-21 03:45



我按照www.aspfree.com/c/a/C-Sharp/Crystal-Reports-for-Visual-Studio-2005-in-CSharp/使用C#类。我有一个包含数百个字段的复杂的自定义绘制报告。我看不到从这里到那里的好路。我看了一下:codeguru.com/csharp/.net/net_general/toolsand3rdparty/article.php/c13253。 - e-holder
如果要将Crystal Report绑定到普通旧对象,只需公开byte []属性。 CR会将其视为图像。 - Josh Bush
找到了!我曾经尝试过“Bitmap”属性,但是在我已经完成的阅读中没有遇到byte [] CR技巧。 - e-holder
@JoshBush你能解释一下这是如何在VB.NET中完成的吗? - Keith
@JoshBush我从命令行打印报告,图片没有出现,我想我错过了什么。 - Eli Ekstein


我终于使用了解决方案 byte[] 小姐在这里发布了乔什。

如果您使用普通的旧C#Object填充Crystal Reports,则此解决方案适用(请参阅 http://www.aspfree.com/c/a/C-Sharp/Crystal-Reports-for-Visual-Studio-2005-in-CSharp/ 有关此方法的信息)。

在C#类中,插入以下代码:

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中的C#对象映射。你应该看到了 Bitmap 属性作为CR字段。只需将其拖到表单上即可。它的类型为IBlobFieldObject。当你跑步时,你应该看到你的形象。


2
2018-02-24 16:30



如何在VB.NET中完成? - Keith
自从我使用Crystal或VB以来已经很久了。不知道我是否可以提供帮助。你需要帮助转换到VB的哪一部分?字节数组?流/读者?物业? CR中的对象映射? - e-holder
几乎整个事情,但没关系,我最终只使用Microsoft Reports和动态图像完美地工作。 11.5在图形位置选项中,Crystal Reports看起来像是一块垃圾。它完全忽略了你放在那里的任何东西。我在网上找到的所有这些解决方案都适用于旧版本。非常感谢您回复旧帖。 - Keith
是。微软报告很好。 CR不好。 - e-holder


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

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

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

  1. 选择一个目录并在那里放置一个BMP(例如,“C:\ Temp \ image.bmp”)。
  2. 从CR-Designer a)右键单击 - >插入 - > OLE对象... b)选择“从文件创建”c)选中“链接”复选框d)浏览并选择步骤1中定义的bmp e)单击好的f)将图像放在表格上。
  3. 在C#代码中在运行时覆盖/更新映像。从理论上讲,既然你插了一个 链接 对于图像文件,它将在刷新表单时更新。

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


2
2018-02-18 22:36



不确定“链接”选项的作用。我一直以为插入会将图片嵌入到报告中。 - dotjoe
根据该复选框的“这是什么”帮助,可以选择嵌入图像或链接到图像。我收集它类似于文件的窗口“快捷方式”(或unix中的文件系统链接)。如果它没有嵌入图像,它肯定似乎应该工作。 - e-holder
同样在VB.NET VS 2010中失败,@ e-holder - 原始图像始终保持不变。 - Keith
这很有效。只需替换您选择的路径中的图像(手动或通过代码)。谢谢! - smukamuka
不确定CR版本的细微变化有什么变化,但现在图像有效,但无法通过传递的参数更新。它忽略该参数并提示用户输入该位置。 Argggg - Keith


您还可以使用条件公式来设置图像的位置。看到 Crystal Reports:动态图像


1
2018-03-15 20:23



你的链接是空的:( - yusuf karatoprak
离奇。它必须是一个WordPress的东西。它现在有效。 - craig


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

然后在步骤#8中,使用参数而不是硬编码路径。


1
2017-09-24 17:27



谢谢,但这个解决方案适用于比我们使用的更新版本的Crystal。我们在图像控件属性中没有“图形位置”按钮。 - Keith
是的,这只适用于CR 11及以上版本。 - dotjoe
与其他@Keith不同 - 我使用CR 11.5并且该路由仍然不起作用。图像永远不会改变原始图像。 - Keith


我发现有用的另一个选项是插入您想要使用的图片。相应地定位图形,然后右键单击图形并转到格式图形>常用。选中Suppress框,然后单击公式按钮,显示为x-2。进入公式窗口后,只需添加代码以确定是否应该抑制图形。

就我而言,我正在为多个实体构建一个发票模板。在公式窗口中,我只写了COMPANY <> 1100,这意味着每次为1100以外的公司运行发票时,1100图形将被抑制。

希望这会让生活更轻松......


1
2018-04-28 12:29





就像乔希说的那样..你必须用数据集来推动图像。或者,将图像放入数据库表一次,并使用子报表多次拉出。


0
2018-02-21 03:54