我有一个我在CR2008
制作的Crystal报表,我正在从vb.net
应用程序打印。在此报告中,我有一个图像和一个公式字段。
图像公式(在格式图形>图片>图形位置下设置为名为@imgLocation
的公式字段。
在我的vb.net
代码中,我有以下块来从数据库中选择保存的文件路径,然后使用此值填充@imgLocation
,以设置正在显示的图像。
Try
Dim logoPath As String = ds.Tables(0).Rows(0).Item("reportLogoPath") & ""
If logoPath = "" Then
MessageBox.Show("No logo path has been defined in the System Settings. Please set " & _
"one and try again.", "Load Report Failed", MessageBoxButtons.OK)
Exit Sub
Else
cReport.DataDefinition.FormulaFields.Item(2).Text = Chr(34) & logoPath & Chr(34)
End If
Catch ex As Exception
errorLog(ex)
End Try
我见过这个工作两次。当我有FormulaFields.Item(2)
时,我想要的图像替换了占位符图像,但随后我调整了图像大小并且它不起作用。然后我更改了索引的值,它与FormulaFields.Item(4)
一起使用,但在我调整图像大小时再次停止工作。
为什么索引会发生变化,它的方法是什么?
我尝试使用命名参数选项,但FormulaFields.Item("@imgLocation")
给了我错误
索引无效
修改
根据@Bugs请求,这是显示正确字符串和图像的报告
然后,删除并重新保存图像后(但尺寸略大),参数仍然正确传递,但显示的是占位符图像。
这让我觉得现在它与图像尺寸有关,但是,将其重新调整为原始尺寸仍然没有再显示它。
编辑2
我是否正在加载一个包含报表查看器的新表单,而不是从同一表单中打开它?
cReport.RecordSelectionFormula = selectionFormula
Me.Cursor = Cursors.Default
Dim f As New frmReportViewer(con, cReport, 0)
f.Show()
Private Sub frmReportViewer_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Try
setFormSizes(Me, con)
Me.Location = New Point((Screen.PrimaryScreen.WorkingArea.Width / 2) - (Me.Width / 2), 10)
Me.Text = "Report Viewer"
Dim logOnInfo As New TableLogOnInfo()
Dim i As Integer
For i = 0 To cReport.Database.Tables.Count - 1
logOnInfo.ConnectionInfo.DatabaseName = "comm_db"
logOnInfo.ConnectionInfo.Password = "Acplus2016!"
cReport.Database.Tables.Item(i).ApplyLogOnInfo(logOnInfo)
Next i
cReport.VerifyDatabase()
crViewer.ReportSource = cReport
crViewer.ToolPanelView = CrystalDecisions.Windows.Forms.ToolPanelViewType.None
crViewer.Zoom(87)
Catch ex As Exception
errorLog(ex)
End Try
End Sub
答案 0 :(得分:1)
请注意我的答案是解决有关添加参数的部分。目前,无可用图像占位符证明难以解决。
要添加参数,请按以下步骤操作:
在Crystal Reports中添加名为 imageLocation 的参数:
按确定后,您的列表中应该有如下参数:
以下代码会将值传递给参数:
Dim cReport As New ReportDocument
cReport.Load("C:\Report.rpt")
If cReport.ParameterFields.Item("imageLocation") IsNot Nothing Then
cReport.SetParameterValue("imageLocation", "\\SAGE200FS\Sage\StockImages\sc002.jpg")
End If
reportViewer.ReportSource = cReport
这是输出(我已将参数添加到报告中):
请注意,如果您传递参数并且它们显示在报告中,请确保您没有
cReport.VerifyDatabase()
。这通常会抛出一个询问参数值的对话框。
对话框的屏幕截图:
如果不调用cReport.VerifyDatabase()
,则会停止显示对话框。
现在,通过Crystal Reports,您可以使用参数设置图形位置。为此,请将参数添加到报表中并禁止显示该字段(因为您不想看到它)。然后,您可以添加Report Field
作为位置。
将参数添加到报告并禁止显示:
为Report Field
添加OLE Object
作为图形位置:〜=
运行报告并输入参数。这将相应地改变图像。请参见两个屏幕截图:
<强> SC001:强>:
<强> INT4303:强>
然而,这似乎不适用于VB。
ReportViewer
无法处理图像的更改。而是留下默认图像。我不确定为什么会这样,我猜测它是Crystal的一个错误。如果有人知道为什么会发生这种情况,请随时发表评论。
编辑
在讨论了聊天中的较小点之后,我们似乎已经知道问题是由于文件路径而产生的。由于\\server\...\...\image.png
没有显示,因此将其保存到数据库中,但在将其更改为Z:\...\...\image.png
之后,它每次都运行良好。这是因为文件路径一直以来。