Update to this post: I have found a bug in the CrystalReportViewer that I address here.
In creating a ASP.NET Web Forms site for viewing Crystal Reports, I needed to open multiple dates for the same report to compare values. The previous setup I used would not allow this; only one report could be open at a time. To remedy this, I changed the way reports would be loaded, and made a separate window for each one.
Excerpt of the home page code:
Report |
Report Date |
Begin Date |
End Date |
|
…and its code behind:
Imports AjaxControlToolkit Imports CrystalDecisions.CrystalReports.Engine Imports CrystalDecisions.Shared Imports CrystalDecisions.Web Imports System.IO Partial Class _Default Inherits System.Web.UI.Page Protected Sub Page_Init(sender As Object, e As System.EventArgs) Handles Me.Init If Not Page.IsPostBack Then txtSingleDate.Text = Now.Date() txtBeginDate.Text = Now.Date() txtEndDate.Text = Now.Date() End If End Sub Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load If Not Page.IsPostBack Then Dim dirpath As String = Utilities.AppSettingsFunction.getValue("ReportFolder") Dim thedir As DirectoryInfo = New DirectoryInfo(Server.MapPath(dirpath)) Dim filenames As FileInfo() = thedir.GetFiles() ddlReports.DataSource = filenames ddlReports.DataBind() For Each report As ListItem In ddlReports.Items Dim reportFileName As String = report.Value Dim reportText As String = reportFileName reportText = Replace(reportText, ".rpt", "") report.Text = reportText Next End If ShowPanels() End Sub Protected Function SetParameters() As String Dim strOnClientClick As String Dim BeginDate As String Dim EndDate As String Dim SingleDate As String Dim RptName As String BeginDate = txtBeginDate.Text EndDate = txtEndDate.Text SingleDate = txtSingleDate.Text RptName = ddlReports.SelectedValue strOnClientClick = "window.open('Pages/Reports.aspx?guid=" & newGuid().ToString & "&rpt=" & RptName If pnlstartenddates.Visible Then strOnClientClick += "&begin=" & BeginDate & "&end=" & EndDate ElseIf pnlreportdate.Visible Then strOnClientClick += "&single=" & SingleDate End If strOnClientClick += "','_blank');" Return strOnClientClick End Function Protected Sub ShowPanels() Dim strSelectedValue As String Dim bSingleDate As Boolean Dim bMultiDate As Boolean bSingleDate = False bMultiDate = False strSelectedValue = ddlReports.SelectedValue.ToString() Dim arrSingleDate() As String = Utilities.AppSettingsFunction.getValue("SingleDate").Split(",") Dim arrMultiDate() As String = Utilities.AppSettingsFunction.getValue("MultiDate").Split(",") If Array.IndexOf(arrSingleDate, strSelectedValue) <> -1 Then bSingleDate = True bMultiDate = False ElseIf Array.IndexOf(arrMultiDate, strSelectedValue) <> -1 Then bSingleDate = False bMultiDate = True End If pnlreportdate.Visible = bSingleDate pnlstartenddates.Visible = bMultiDate End Sub Protected Function newGuid() As Guid Dim guid As Guid guid = guid.NewGuid() Return guid End Function Protected Sub btnGenerate_Click(sender As Object, e As System.EventArgs) Handles btnGenerate.Click Dim strOnClientClick As String = SetParameters() Page.ClientScript.RegisterStartupScript(Me.GetType(), newGuid().ToString(), strOnClientClick, True) End Sub End Class
The reports.aspx page that is used for all reports:
<%@ Page Language="VB" AutoEventWireup="true" CodeFile="Reports.aspx.vb" Inherits="Pages_Reports" %> <%@ Register Assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" Namespace="CrystalDecisions.Web" TagPrefix="CR" %>
…and the code behind for reports.aspx:
Imports CrystalDecisions.Shared Imports System.IO Imports CrystalDecisions.CrystalReports.Engine Partial Class Pages_Reports Inherits System.Web.UI.Page Protected strQueryString As String Protected Sub Page_Init(sender As Object, e As System.EventArgs) Handles Me.Init strQueryString = Request.QueryString.ToString() Page.Title = Replace(Request.QueryString("rpt").ToString(), ".rpt", "") If Not Page.IsPostBack Then 'Do nothing ElseIf Session(strQueryString) IsNot Nothing Then Me.CrystalReportViewer1.ReportSource = Session(strQueryString) CrystalReportViewer1.DataBind() UpdatePanel1.Update() End If End Sub Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load If Not Page.IsPostBack Then Dim strReportName As String = Request.QueryString("rpt") Dim strSingleDate As String = Request.QueryString("single") Dim strBeginDate As String = Request.QueryString("begin") Dim strEndDate As String = Request.QueryString("end") Dim bSingleDate As Boolean = False Dim bMultiDate As Boolean = False Dim arrSingleDate() As String = Utilities.AppSettingsFunction.getValue("SingleDate").Split(",") Dim arrMultiDate() As String = Utilities.AppSettingsFunction.getValue("MultiDate").Split(",") If Array.IndexOf(arrSingleDate, strReportName) <> -1 Then bSingleDate = True bMultiDate = False ElseIf Array.IndexOf(arrMultiDate, strReportName) <> -1 Then bSingleDate = False bMultiDate = True End If Dim connInfo As New ConnectionInfo Dim rptDoc As New ReportDocument 'setup the connection connInfo = GetConnectionInfo() 'load the Crystal Report rptDoc.Load(Server.MapPath( _ Utilities.AppSettingsFunction.getValue("ReportFolder") _ & strReportName)) 'add required parameters If bSingleDate Then rptDoc.SetParameterValue("REPORT_DATE", strSingleDate & " 23:59:59") End If If bMultiDate Then rptDoc.SetParameterValue("BEGIN_DATE", strBeginDate & " 00:00:00") rptDoc.SetParameterValue("END_DATE", strEndDate & " 23:59:59") End If 'apply logon information For Each tbl As CrystalDecisions.CrystalReports.Engine.Table In rptDoc.Database.Tables Dim repTblLogonInfo As TableLogOnInfo = tbl.LogOnInfo repTblLogonInfo.ConnectionInfo = connInfo tbl.ApplyLogOnInfo(repTblLogonInfo) Next 'Set, bind, and display Crystal Reports Viewer data source Session(strQueryString) = rptDoc Me.CrystalReportViewer1.ReportSource = Session(strQueryString) CrystalReportViewer1.DataBind() ElseIf Session(strQueryString) IsNot Nothing Then 'Dim rptView As CrystalReportViewer = FindControl("rptViewer_" & report.Text) Me.CrystalReportViewer1.ReportSource = Session(strQueryString) UpdatePanel1.Update() End If End Sub Protected Function GetConnectionInfo() As ConnectionInfo Dim connInfo As New ConnectionInfo 'setup the connection With connInfo .ServerName = Utilities.AppSettingsFunction.getValue("ServerName_" & Utilities.AppSettingsFunction.getValue("Environment")) .DatabaseName = "" .UserID = Utilities.AppSettingsFunction.getValue("UserID_" & Utilities.AppSettingsFunction.getValue("Environment")) .Password = Utilities.AppSettingsFunction.getValue("Password_" & Utilities.AppSettingsFunction.getValue("Environment")) End With Return connInfo End Function End Class
One Reply to “Spawning a New Window for Each CrystalReportViewer”
You must log in to post a comment.