ASP C#应用与开发的水晶报告;回邮问题
我有一个网络表单,只有一个按钮和一个crystal报表查看器。Crystal report基于MS SQL存储过程&使用使用SQL Server身份验证的连接进行设计。 我注意到,如果我调用在页面加载中显示报告的方法,我的crystal report将完美加载。但是,如果我通过单击按钮触发报告加载(我必须在部署时接受报告参数),则会发生以下情况:ASP C#应用与开发的水晶报告;回邮问题,c#,asp.net,crystal-reports,C#,Asp.net,Crystal Reports,我有一个网络表单,只有一个按钮和一个crystal报表查看器。Crystal report基于MS SQL存储过程&使用使用SQL Server身份验证的连接进行设计。 我注意到,如果我调用在页面加载中显示报告的方法,我的crystal report将完美加载。但是,如果我通过单击按钮触发报告加载(我必须在部署时接受报告参数),则会发生以下情况: 将提示Crystal报告参数(在没有回发的情况下加载报告时不会出现这种情况) 加载第一页后,第二页导航提示登录数据库。如果不提供登录详细信息(通常仅提
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="c2.aspx.cs" Inherits="CrystalTest.c2" %>
<%@ Register Assembly="CrystalDecisions.Web, Version=13.0.4000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" Namespace="CrystalDecisions.Web" TagPrefix="CR" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" Text="Show Report" OnClick="Button1_Click" />
<CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" AutoDataBind="False" GroupTreeImagesFolderUrl="" Height="1202px" ReportSourceID="CrystalReportSource1" ToolbarImagesFolderUrl="" ToolPanelView="None" ToolPanelWidth="200px" Width="1104px" />
</div>
</form>
</body>
</html>
我参考了来自不同网站的以下线程,并能够开发一个简单的解决方案 一,。 二, 我所需要的只是在回发发生后将登录信息传递回报表查看器一次。示例如下: ASP页面
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="c3.aspx.cs" Inherits="CrystalTest.c3" %>
<%@ Register Assembly="CrystalDecisions.Web, Version=13.0.4000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" Namespace="CrystalDecisions.Web" TagPrefix="CR" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" Text="Print Button" OnClick="Button1_Click" />
<CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" AutoDataBind="false" />
</div>
</form>
</body>
</html>
此解决方案对于子报告也足够好,因为所有身份验证都由使用方法SetdblogonforReport的单个登录调用完成
希望这对其他人没什么帮助。我从不同的网站上引用了以下内容,并且能够开发出一个简单的解决方案 一,。 二, 我所需要的只是在回发发生后将登录信息传递回报表查看器一次。示例如下: ASP页面
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="c3.aspx.cs" Inherits="CrystalTest.c3" %>
<%@ Register Assembly="CrystalDecisions.Web, Version=13.0.4000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" Namespace="CrystalDecisions.Web" TagPrefix="CR" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" Text="Print Button" OnClick="Button1_Click" />
<CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" AutoDataBind="false" />
</div>
</form>
</body>
</html>
此解决方案对于子报告也足够好,因为所有身份验证都由使用方法SetdblogonforReport的单个登录调用完成
希望这对其他人没什么帮助。我有一个更好的解决方案&不要删除前一个,因为当页面中存在页面加载方法时,它会处理回发。下面的答案(由SAP推荐)是我目前在项目中使用的答案。
按照建议使用“会话”和“页面初始化”解决此需求。请注意,在生成报告之前,我的应用程序需要收集来自最终用户的许多输入&许多文本输入都设置为true。每次发生自动回邮时,Crystal Report都会刷新,因此我建议在web表单中使用尽可能少的启用自动回邮的输入字段
ASP页面示例
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="c4.aspx.cs" Inherits="CrystalTest.c4" %>
<%@ Register Assembly="CrystalDecisions.Web, Version=13.0.4000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" Namespace="CrystalDecisions.Web" TagPrefix="CR" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" Text="Print Report" OnClick="Button1_Click" />
<CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" AutoDataBind="true" />
</div>
</form>
</body>
</html>
我有一个更好的解决方案&不要删除前一个,因为当页面中存在page_load方法时,它会处理回发。下面的答案(由SAP推荐)是我目前在项目中使用的答案。
按照建议使用“会话”和“页面初始化”解决此需求。请注意,在生成报告之前,我的应用程序需要收集来自最终用户的许多输入&许多文本输入都设置为true。每次发生自动回邮时,Crystal Report都会刷新,因此我建议在web表单中使用尽可能少的启用自动回邮的输入字段
ASP页面示例
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="c4.aspx.cs" Inherits="CrystalTest.c4" %>
<%@ Register Assembly="CrystalDecisions.Web, Version=13.0.4000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" Namespace="CrystalDecisions.Web" TagPrefix="CR" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" Text="Print Report" OnClick="Button1_Click" />
<CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" AutoDataBind="true" />
</div>
</form>
</body>
</html>
using CrystalDecisions.CrystalReports.Engine;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace CrystalTest
{
public partial class c4 : System.Web.UI.Page
{
protected void Page_Init(object sender, EventArgs e)
{
if (IsPostBack)
{
CrystalReportViewer1.ReportSource = (ReportDocument)Session["Report"];
}
}
private void ShowReport1()
{
string ConnectionString = ConfigurationManager.ConnectionStrings["menass"].ToString();
using (SqlConnection con = new SqlConnection(ConnectionString))
{
using (SqlCommand cmd = new SqlCommand("GETMONTHSALARY", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@pProcessYear", SqlDbType.Int).Value = 2020;
cmd.Parameters.Add("@pProcessMonth", SqlDbType.Int).Value = 1;
cmd.Parameters.Add("@pProcessSection", SqlDbType.VarChar).Value = "9";
cmd.Parameters.Add("@pProcessSite", SqlDbType.VarChar).Value = "1";
cmd.Parameters.Add("@pProcessCatg", SqlDbType.VarChar).Value = "1";
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds, "SalaryDT");
ReportDocument oRpt = new ReportDocument();
oRpt.Load(Server.MapPath(@"~/dataset/CrystalReport1.rpt"));
oRpt.DataSourceConnections.Clear();
oRpt.SetDataSource(ds);
oRpt.Subreports[0].SetDataSource(FillOverTime());
CrystalReportViewer1.Visible = true;
CrystalReportViewer1.ReportSource = oRpt;
Session["Report"] = oRpt;
}
}
}
private DataSet FillOverTime()
{
string ConnectionString = ConfigurationManager.ConnectionStrings["menass"].ToString();
using (SqlConnection con = new SqlConnection(ConnectionString))
{
using (SqlCommand cmd = new SqlCommand("GetEmployeeOverTime", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@pEmployeeCode", SqlDbType.VarChar).Value = DBNull.Value;
cmd.Parameters.Add("@pProcessYear", SqlDbType.Int).Value = 2020;
cmd.Parameters.Add("@pProcessMonth", SqlDbType.Int).Value = 1;
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds1 = new DataSet();
adapter.Fill(ds1, "OverTimeDT");
return ds1;
}
}
}
protected void Button1_Click(object sender, EventArgs e)
{
ShowReport1();
}
}
}