2012-07-09 35 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