Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP C#应用与开发的水晶报告;回邮问题_C#_Asp.net_Crystal Reports - Fatal编程技术网

ASP C#应用与开发的水晶报告;回邮问题

ASP C#应用与开发的水晶报告;回邮问题,c#,asp.net,crystal-reports,C#,Asp.net,Crystal Reports,我有一个网络表单,只有一个按钮和一个crystal报表查看器。Crystal report基于MS SQL存储过程&使用使用SQL Server身份验证的连接进行设计。 我注意到,如果我调用在页面加载中显示报告的方法,我的crystal report将完美加载。但是,如果我通过单击按钮触发报告加载(我必须在部署时接受报告参数),则会发生以下情况: 将提示Crystal报告参数(在没有回发的情况下加载报告时不会出现这种情况) 加载第一页后,第二页导航提示登录数据库。如果不提供登录详细信息(通常仅提

我有一个网络表单,只有一个按钮和一个crystal报表查看器。Crystal report基于MS SQL存储过程&使用使用SQL Server身份验证的连接进行设计。 我注意到,如果我调用在页面加载中显示报告的方法,我的crystal report将完美加载。但是,如果我通过单击按钮触发报告加载(我必须在部署时接受报告参数),则会发生以下情况:

  • 将提示Crystal报告参数(在没有回发的情况下加载报告时不会出现这种情况)
  • 加载第一页后,第二页导航提示登录数据库。如果不提供登录详细信息(通常仅提供密码),则无法继续。此登录提示仅适用于报告的第2页
  • 为了避免这种情况,我使用集成安全性创建了一个新连接&postback停止请求参数和数据库登录。不幸的是,我无法使用集成安全性来部署应用程序&pry以获得合适的解决方案或解决方案

    最糟糕的是,我已经有了RDLC报告,它的设计也有同样的要求,但是我发现我有更好的格式选项,比如在使用Crystal report时在子报告上画线来拆分列

    这是我到现在为止一直在尝试的

    ASP页面

    <%@ 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();
            }
        }
    }