Кнопка печати Crystal Report заставляет веб-форму C# выполнить POSTBACK, что приводит к невозможности повторного запуска другой кнопки
У меня была проблема с Crystal Report в C# Webform. Мне пришлось создать веб-страницу, и она смогла успешно загрузить отчет через Crystal Report Viewer, но проблема в том, что, как только пользователь нажал на кнопку "Печать" в Crystal Report Viewer, страница изменится на POSTBACk, что сделает мой другой кнопки на веб-странице, которые не могут запустить запрограммированные события снова. Так есть ли у кого-нибудь решение этой моей проблемы, пожалуйста, направьте меня? Ваша помощь высоко ценится. Заранее спасибо. Ниже мой код
using CrystalDecisions.CrystalReports.Engine
namespace Report1
{
protected void Page_Load(..)
{
//Previous code
//if (!Page.IsPostBack)
//{ LoadReport(); }
//else
//{ LoadReport(); }
//Recommended code
LoadReport();
}
protected void Button1_Click()
{
Response.Redirect("MainPage.aspx");
}
protected void CrystalReportViewer1_Init()
{}
private void LoadReport()
{
ConnectionInfo connectionInfo = new ConnectionInfo();
connectionInfo.ServerName = @"server";
connectionInfo.DatabaseName = "tbl1";
connectionInfo.UserID = "sa";
connectionInfo.Password = "sa";
connectionInfo.Type = ConnectionInfoType.SQL;
connectionInfo.AllowCustomConnection = true;
string strParam = Convert.ToString(Request.QueryString["Param"]);
label1.Text = strParam;
ReportDocument cryRpt = new ReportDocument();
Report1 crystalReport1;
crystalReport1 = new Report1();
cryRpt.Load(Server.MapPath("CrystalReport1.rpt"));
SetDBLogonForReport(connectionInfo, cryRpt);
cryRpt.SetParameterValue("Param", strParam);
CrystalReportViewer1.SelectionFormula = "{Param}";
CrystalReportViewer1.ReportSource = crystalReport1;
CrystalReportViewer1.ReportSource = cryRpt;
}
private void SetDBLogonForReport(ConnectionInfo connectionInfo, ReportDocument reportDocument)
{
Tables tables = reportDocument.Database.Tables;
foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
{
TableLogOnInfo tableLogonInfo = table.LogOnInfo;
tableLogonInfo.ConnectionInfo = connectionInfo;
table.ApplyLogOnInfo(tableLogonInfo);
}
}
}
код позади
<%@Page Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Report.aspx.cs" Inherits="Project.Report" %>
<td class="style5">
<asp:Button ID="MainButton" runat="server" onclick="MainButton_Click"
Text="Back To MainPage" Width="174px" CausesValidation="False" />
</td>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server"
EnableDatabaseLogonPrompt="False" ReuseParameterValuesOnRefresh="True"
AutoDataBind="True" Height="1269px" ToolPanelWidth="200px" Width="881px"
oninit="CrystalReportViewer1_Init" GroupTreeImagesFolderUrl=""
GroupTreeStyle-ShowLines="False" ReportSourceID="CrystalReportSource1"
ToolbarImagesFolderUrl="" ToolPanelView="None"
EnableParameterPrompt="False" SeparatePages="False" HasCrystalLogo="False"
HasToggleGroupTreeButton="False" HasToggleParameterPanelButton="False" />
<CR:CrystalReportSource ID="CrystalReportSource1" runat="server">
<Report FileName="CrystalReport1.rpt">
</Report>
</CR:CrystalReportSource>
</asp:Content>
2 ответа
Спасибо за ответ. Так что мне нужно будет вызывать функцию LoadReport только во время Not Postback. Я пытался использовать этот метод до этого, но из-за этого кнопка "Печать отчета" не смогла распечатать отчет.
Привет Кампаноло_1,
Все еще не может сделать это с помощью asp:button Response.Redirect(). Поэтому я решил использовать кнопку javascript: onclick для того же перенаправления [onclick=window.location('MainPage.aspx')]]. По иронии судьбы, он работает довольно хорошо с обратной передачей CrystalReportViewer или обратной передачей!
Ваша проблема прямо здесь:
protected void Page_Load(..)
{
if (!Page.IsPostBack)
{ LoadReport; }
else
{ LoadReport; }
}
Вы вызываете функцию LoadReport независимо от того, является ли она обратной передачей или нет.