【问题标题】:Dynamically change an image in a Crystal Report at runtime在运行时动态更改 Crystal Report 中的图像
【发布时间】:2010-09-12 19:07:07
【问题描述】:

我正在使用 VisualStudio 2005 中包含的 Crystal Reports。我想更改在运行时显示在报表上的图像,最好是通过构建图像文件的路径,然后让该图像显示在报表上。

有人能用这个版本的 Crystal Reports 做到这一点吗?

【问题讨论】:

    标签: image crystal-reports report


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,但此解决方案适用于比我们使用的新版本的 Crystal。我们在图像控件属性中没有“图形位置”按钮。
    • 与其他 @Keith 不同——我使用的是 CR 11.5,但该路线仍然不起作用。图像从不改变原始图像。
    【解决方案2】:

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

    [我已经通过 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 的大小)。

    【讨论】:

    • 不确定“链接”选项的作用。我一直认为insert会将图片嵌入到报表中。
    • 根据该复选框的“这是什么”帮助,可以选择嵌入图像或链接到它。我认为它类似于文件(或unix中的文件系统链接)的Windows“快捷方式”。如果它没有嵌入图像,那么它确实应该可以工作。
    • 在 VB.NET VS 2010 中同样失败,@e-holder -- 原始图像始终保留。
    • 这是有效的。只需替换您选择的路径中的图像(手动或通过代码)。谢谢!
    • 不确定 CR 版本的细微变化有什么变化,但现在图像可以工作,但无法通过传递的参数进行更新。它忽略参数并提示用户输入位置。阿格格
    【解决方案3】:

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

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

    【讨论】:

    • 我根据 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。
    • 如果您将 Crystal Report 绑定到普通的旧对象,只需公开一个 byte[] 属性。 CR 会将其视为图像。
    • 尤里卡!我尝试了一个“位图”属性,但在我所做的阅读中没有遇到 byte[] CR 技巧。
    • @JoshBush 我正在从命令行打印报告,但图片没有显示,我想我遗漏了一些东西。
    【解决方案4】:

    就像 Josh 说的那样。您必须使用数据集推送图像。或者,将图像一次放入数据库表中,然后使用子报表将其多次拉入。

    【讨论】:

      【解决方案5】:

      我终于使用 Josh 在此处发布的 byte[] 提示找到了解决方案。

      如果您使用普通的旧 C# 对象来填充 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 类型。运行时,您应该会看到自己的图像。

      【讨论】:

      • 很久没用Crystal或者VB了。不知道能不能帮上忙。您需要帮助翻译成 VB 的哪一部分?字节数组?流/读者?财产? CR 中的对象映射?
      • 几乎整个事情,但没关系,我最终只使用 Microsoft Reports 和动态图像完美地工作。当谈到图形位置选项时,11.5 Crystal Reports 似乎是个废话。它完全忽略了你放在那里的任何东西。我在网上为 CR 找到的所有这些解决方案都是针对旧版本的。非常感谢您回复旧帖子。
      【解决方案6】:

      您还可以使用条件公式来设置图像的位置。见Crystal Reports: Dynamic Images

      【讨论】:

        【解决方案7】:

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

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

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

        【讨论】:

          【解决方案8】:

          我在 Visual Studio 2015 中使用的当前版本的 Crystal Reports(适用于 Visual Studio 2012+)支持此功能。请按照以下步骤操作:

          1. 在报表中插入图片。这将作为您的 占位符。'
          2. 右键单击您的图片并选择设置对象格式
          3. 选择图片选项卡并按下公式按钮
          4. 将打开一个公式窗口。输入一个公式,将您的图片作为链接查找。

            如果({@isDonor}="1") 然后“http://www.ny.org/images/aaf/picture1.jpg” 否则“http://www.ny.org/images/aaf/picture2.jpg 你就完成了!

          【讨论】:

          • 使用这个过程并简单地将公式设置为一个参数,就可以从代码中设置完整的 URL,让我们获得最大的灵活性和最少的 .rpt 调整。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-14
          • 1970-01-01
          相关资源
          最近更新 更多