首页 > 解决方案 > Crystal Reports、vb.net 和动态图片:代码中的宽度单位测量错误

问题描述

我在水晶报表中动态加载图片时遇到了麻烦。

我需要在运行时(通过公式)加载图片并在代码中设置其宽度。在 cr 文档中声明对象大小在通过代码访问时以缇表示。

我发现动态加载的图片并非如此。

以下是重现此问题的步骤:

此图片打印后的宽度为 10 厘米 ((10 / 2.54) * 300 ~= 1181)。

这样,报告包含同一张图片的两个“副本”,一个是嵌入的,一个是在运行时加载的。

这是相关代码:

Private report As New ReportDocument

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    report.Load("C:\Path\to\10cm.rpt", OpenReportMethod.OpenReportByDefault)

    viewer.ReportSource = report

End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim MyPic1W = report.ReportDefinition.ReportObjects("MyPic1").Width ' 5669 <-- this is in twips and the value is OK: 1mm ~= 56.69 twips
    Dim MyPic2W = report.ReportDefinition.ReportObjects("MyPic2").Width ' 435 <- ????????????????????????  

End Sub ' Breakpoint here

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

    report.ReportDefinition.ReportObjects("MyPic1").Width = 8504 ' MyPic1 is correctly resized to 15 cm
    report.ReportDefinition.ReportObjects("MyPic2").Width = 8504 ' MyPic2 becomes really large!

    viewer.ReportSource = report

End Sub

正如您在 Button1_Click 中看到的,MyPic1 的宽度正确地以缇表示,而 MyPic2 的宽度以不同的单位表示。

尝试使用缇设置图片宽度(Button2_Click)适用于 MyPic1,而 MyPic2 变得非常大。如果我指定一个与其未知单位成比例的值,MyPic2 的大小将正确调整:如果我将宽度设置为 435 * 1.5 ~= 653,它的大小正确地变为 15cm。

有人知道这个单位来自哪里吗?

谢谢!

标签: c#vb.netcrystal-reports

解决方案


我的经验是,要求 Crystal 调整图像大小不是一个好主意。它可能会增加 rpt 内存消耗。

最好在 Crystal 外部调整图像大小并动态加载生成的文件。

此处列出的至少一个 UFL允许 Crystal 公式处理图像大小调整,因此 Crystal 中的“图形位置”表达式可以调整大小(在 Crystal 之外),然后加载图像文件。您可以在代码中执行相同的操作。


推荐阅读