Кнопка печати 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 независимо от того, является ли она обратной передачей или нет.

Другие вопросы по тегам