2016-04-22 7 views
0

Ich habe einen CrystalReportViewer, der einen Bericht zeigt. Ich übergebe zwei Parameter, die die Daten ändern. Dies funktioniert, es sei denn, Sie versuchen, den Bericht weiter zu vertiefen, woraufhin er auf die Standardparameter zurückgesetzt wird.CrystalReportViewer vergessen Parameter

Es ist ein bisschen wie das Reportviewer-Element aktualisiert sich selbst und vergisst alles. Ich hatte eine page_init-Methode, die versuchte, die Werte zurück zu schieben, aber ich bekam Objektreferenzfehler, also hatte ich es wahrscheinlich falsch gemacht.

Was sollte ich noch versuchen? Bitte beachten Sie folgenden Code:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (Session["ReportSource"] != null) 
     { 
      CrystalReportViewer1.ReportSource = (ReportDocument)Session["ReportSource"]; 
     } 
     else 
     { 
      ReportDocument reportDocument = new ReportDocument(); 
      reportDocument.Load(Server.MapPath("~/Report/In Out.rpt")); 
      reportDocument.SetDatabaseLogon("user", "pass" ,@"server", "db"); //removed credentials for stackoverflow! 
      CrystalReportViewer1.ReportSource = reportDocument; 
      Session["ReportSource"] = reportDocument; 

     } 
    } 

    protected void butReport_Click(object sender, EventArgs e) 
    { 
     ReportDocument reportDocument = new ReportDocument(); 
     reportDocument.Load(Server.MapPath("./Report/In Out.rpt")); 
      reportDocument.SetDatabaseLogon("user", "pass" ,@"server", "db"); //removed credentials for stackoverflow!  
     ///Load Session variables with values from web-controls 
     Session["@FromDate"] = ConvertToDateTime(Request.Form["StartDate"]); 
     Session["@ToDate"] = ConvertToDateTime(Request.Form["EndDate"]); 
     reportDocument.SetParameterValue("Start", Session["@FromDate"]); 
     reportDocument.SetParameterValue("End", Session["@ToDate"]); 
     CrystalReportViewer1.ReportSource = reportDocument; 
    } 

Mein CR eingebettet ist als

<div align="center"> 
      <asp:TextBox ID="StartDate" runat="server" type="date" placeholder="e.g. 31/12/2014" ></asp:TextBox> 
      <asp:TextBox ID="EndDate" runat="server" type="date" placeholder="e.g. 31/12/2014" ></asp:TextBox> 
      <asp:button runat="server" id="Submit" type="button" value="Show Report" Text="View Report" onclick="butReport_Click" /></div> 

     <div> 
<CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" 
        AutoDataBind="True" EnableDatabaseLogonPrompt="False" 
        GroupTreeImagesFolderUrl="" Height="940px" 
        ToolbarImagesFolderUrl="" ToolPanelWidth="200px" Width="1411px" 
        EnableParameterPrompt="False" ReuseParameterValuesOnRefresh="True" 
        ReportSourceID="CrystalReportSource1" /> 
       <CR:CrystalReportSource ID="CrystalReportSource1" runat="server"> 
        <Report FileName="Report\In Out.rpt"> 
        </Report> 
       </CR:CrystalReportSource> 
</div> 
+0

Sie weisen das Objekt, das nach dem Klick auf die Schaltfläche vorbereitet wurde, niemals der Sitzungsvariablen zu. Der Page_Load-Code bereitet die Parameter nicht vor, und der Schaltflächenklickcode verwendet weder das Objekt aus der Sitzung noch das Ergebnis der Sitzung. Es gibt nichts, was Ihr vorbereiteter Gegenstand tatsächlich behält. – Nyerguds

+0

OK. Ich bin neu in all dem, kannst du auf den Fehler hinweisen und hilfst du mir mit einem Beispielcode? –

+0

Nun, Sie Licht genau angeben möchten, was "Objekt Referenzfehler" Sie bekommen ... – Nyerguds

Antwort

1

folgt Wenn Sie speichern möchten, dass geladene Crystal Reports Dokument in der Sitzung, sollten Sie dies tun, nachdem Sie es initialisieren, mit die Parameter. In dem Moment, in dem diese seltsame Auffrischung passiert, ist es bereits zu spät, und der Code, den Sie haben, um ihn erneut in die Seiteninitialisierung zu laden, enthält und enthält nicht den Parameter loading code.

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (Session["ReportSource"] != null) 
     CrystalReportViewer1.ReportSource = (ReportDocument)Session["ReportSource"]; 
} 

protected void butReport_Click(object sender, EventArgs e) 
{ 
    ReportDocument reportDocument = new ReportDocument(); 
    /* your code to load the document and assign it as datasource to the CrystalReportViewer */ 
    // Assign your result to the session: 
    Session["ReportSource"] = reportDocument; 
} 

Eine andere Möglichkeit ist, einfach alles, was in der butReport_Click auf eine neue Funktion aufzuschlüsseln, und rufen, dass sowohl die Schaltfläche klicken und die init:

protected void Page_Load(object sender, EventArgs e) 
{ 
    PrepareCR(); 
} 

protected void butReport_Click(object sender, EventArgs e) 
{ 
    PrepareCR(); 
} 

protected void PrepareCR() 
{ 
    ReportDocument reportDocument = new ReportDocument(); 
    /* your code to load the document and assign it as datasource to the CrystalReportViewer */ 

} 

Hinweis, ich bin nicht sicher, wie die Ressourcenverwaltung dieser Objekte in ASP.NET geht; Ich weiß in meiner Windows-App (die sie in PDF konvertiert) musste ich sehr vorsichtig sein, das Dokument danach zu schließen, um Fehler zu vermeiden, so dass die erste Methode in diesem Aspekt vorzuziehen sein könnte, da es das Dokument nur einmal öffnet und behält Objekt.

Auch lädt die Einbettung asp xml das Dokument bereits beim Laden der Seite, wiederum ohne diese erforderlichen Parameter?

+0

Vielen Dank! Dies behebt das Problem vollständig (ich habe den ersten Teil verwendet) –

Verwandte Themen