问题描述
我在水晶报表中动态加载图片时遇到了麻烦。
我需要在运行时加载图片(通过公式)并在代码中设置其宽度。 在cr文档中指出,对象大小通过代码访问时以缇表示。
我发现动态加载的图片不是这样。
以下是重现此问题的步骤:
- 创建具有以下规格的“ 10cm.jpg”文件:
- 宽度= 1181像素
- 高度= 100像素
- 密度= 300 dpi
此图片在打印时将为10厘米宽((10 / 2.54)* 300〜= 1181)。
- 创建一个新报告(“ 10cm.rpt”)。
- 插入“ 10cm.jpg”。
- 为此图片设置属性,如下所示:
- 对象名称=“ MyPic1”
- 插入另一张图片(例如10x10,这没关系)。
- 为此图片设置属性,如下所示:
- 对象名称=“ MyPic2”
- 图形位置[X-2](在“图片”标签下)=“ C:\ Path \ to \ 10cm.jpg”
这样,报告将包含同一张图片的两份“副本”,一份嵌入并且一份在运行时加载。
- 现在创建一个VB.NET/C# Windows Forms项目,并放置一个cr查看器和两个按钮。
这是相关代码:
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的宽度则以不同的单位来表达。
对于MyPic1,尝试使用缇设置图片宽度(Button2_Click)是有效的,而MyPic2变得非常大。 如果我指定一个与其未知单位成比例的值,则MyPic2的大小将正确调整:如果我将width设置为435 * 1.5〜= 653,则其大小正确变为15cm。
有人知道这个单位来自哪里吗?
谢谢!
解决方法
我的经验是,要求Crystal调整图像大小不是一个好主意。可能会增加rpt的内存消耗。
最好在Crystal外部调整图像大小并动态加载生成的文件。
here中列出的至少一个UFL允许Crystal公式来调整图像大小,以便Crystal的“ Graphic Location”表达式可以调整大小(在Crystal外部),然后加载图像文件。您可以在代码中执行相同的操作。