2012-07-09 41 views
1

我正在使用VS-2008作为asp.net web应用程序。但是,我在VS 2005中编写了我的报告(我重复使用了其他项目中开发的一些报告)。ASP.NET水晶报表图像字段未显示

报告工作正常,除非图像字段不显示。图像字段是数据库中的'VARBINARY(MAX)'字段。请注意,当我将Crystal Report导出为.pdf时,图像显示在.pdf文件中。

(*我能看到“萤火虫”,但得到的消息“加载图像失败”的图像URL)

我使用的是“TypedDataset”作为数据源的Crystal报表。

我取从数据库中的数据,并做了“DataSet.WriteXML(文件名,WriteMode.WriteSchema)”

下面是代码: -

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    Dim rgx As Regex = New Regex("[^a-zA-Z0-9 -]") 
    strComp = rgx.Replace(strComp, "") 
    strFile = "tempXML" + strComp + ".xml" 
    Dim dsTemp As New DataSet 
    dsTemp.Clear() 
    dsTemp.Tables.Clear() 
    Dim rptengine As New CrystalDecisions.CrystalReports.Engine.ReportDocument 
    rptengine.Load(Session("rptname")) 
    sdate = CType(Session("sdate"), Date) 
    edate = CType(Session("edate"), Date) 
    rptHeading = Session("rptHead") 

    If IO.File.Exists(Server.MapPath("~/" + strFile)) Then 
     dsTemp.ReadXml(Server.MapPath("~/" + strFile), XmlReadMode.ReadSchema) 
     'IO.File.Delete(Server.MapPath("~/" + strFile)) 
     Try 
      If Session("rptname").ToString.Substring(Session("rptname").ToString.LastIndexOf("\") + 1) _ 
       = "Rptemp.rpt" Then 
       Dim dsReport As New DDL.dsEmpList 
       dsReport.Tables("dtEmpList").Merge(dsTemp.Tables(0)) 
       rptengine.SetDataSource(dsReport.Tables(0)) 
      ElseIf Session("rptname").ToString.Substring(Session("rptname").ToString.LastIndexOf("\") + 1) _ 
       = "rptDailyAttendance.rpt" Then 
       Dim dsReport As New DDL.dsDailyReoprt 
       dsReport.Tables("dtDailyReport").Merge(dsTemp.Tables(0)) 
       rptengine.SetDataSource(dsReport.Tables(0)) 
      End If 
     Catch ex As Exception 
      ShowMsg1("Exception : " & ex.Message) 
     End Try 


     '**********************assigning CR-ParameterFields***************************** 
     Dim crParameterFieldDefinitions As ParameterFieldDefinitions 
     Dim crParameterFieldDefinition As ParameterFieldDefinition 
     Dim crParameterValues As ParameterValues 
     Dim crParameterDiscreteValue As ParameterDiscreteValue 
     Dim parameterToDefine As Boolean = False 

     crParameterFieldDefinitions = rptengine.DataDefinition.ParameterFields 

     For Each crParameterFieldDefinition In crParameterFieldDefinitions 
      crParameterDiscreteValue = New ParameterDiscreteValue 
      crParameterValues = crParameterFieldDefinition.CurrentValues 
      Select Case crParameterFieldDefinition.Name 
       Case "sdate" 
        parameterToDefine = True 
        crParameterDiscreteValue.Value = sdate 
       Case "edate" 
        parameterToDefine = True 
        crParameterDiscreteValue.Value = edate 
       Case "heading" 
        parameterToDefine = True 
        crParameterDiscreteValue.Value = rptHeading 
       Case Else 
        parameterToDefine = False 
      End Select 

      If parameterToDefine Then 
       Try 
        crParameterValues.Add(crParameterDiscreteValue) 
        crParameterFieldDefinition.ApplyCurrentValues(crParameterValues) 
       Catch ex As Exception 
        objdata.writelog(ex.Message, "frmRptEngine", "frmRptEngine_Load", Server.MapPath("~/Reports")) 
        ShowMsg1("Error in report generation.") 
        Exit Sub 
       End Try 
      End If 
     Next 

     rptViewer.ReportSource = Nothing 
     rptViewer.ReportSource = rptengine 
     rptViewer.Enabled = True 
     rptViewer.DataBind() 
    Else 
     ShowMsg1("Invalid attempt.") 
    End If 
End Sub 
+0

的Html从Firebug的像场是: -

Image
2012-07-09 07:50:37

回答

2

对于我们这些从运行迁移项目.Net 4.0或更低版本到4.5+我做了一个观察。看起来,如果您的包含查看器的页面位于子目录中,则图像网址将相对于该网页而不是网页应用程序的根目录生成。例如,如果你的页面是/gl/accounts.aspx,那么图像可能是/gl/crystalimagehandler.aspx等 解决这个问题的一个快速方法是将你的处理程序映射更改为以crystalimagehandler.aspx结尾的通配符,或将以下代码放入Global.asax中

protected void Application_BeginRequest(object sender, EventArgs e) 
     { 
      var p = Request.Path.ToLower().Trim(); 
      if (p.EndsWith("/crystalimagehandler.aspx") && p!= "/crystalimagehandler.aspx") 
      { 
       var fullPath=Request.Url.AbsoluteUri.ToLower(); 
       var index = fullPath.IndexOf("/crystalimagehandler.aspx"); 
       Response.Redirect(fullPath.Substring(index)); 
      } 
     } 
+0

良好的信息,但我过去的这个问题,但我会+1你的答案。下次我会试试你的解决方案。 – 2014-09-27 10:11:45