我一个水晶报表,里面一个子报表,主报表和子报表数据源和显示的自动不同,子报表在主报表的页脚,但是发现运行的时候子报表翻页不管用。怎么回事啊?帮忙看看吧。using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using BLL;
using DAL;
using CrystalDecisions.Shared;
using CrystalDecisions.CrystalReports;
using CrystalDecisions.ReportSource;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions;public partial class ARBIS_Report : System.Web.UI.Page
{
    ReportDocument oRpt = new ReportDocument();
    ReportDocument subReport = new ReportDocument();  
    
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsCallback)
        {
            if (Session["Test"] != null && Session["Detail"] != null)
            {
                oRpt.Load(Server.MapPath("~/Report/CR_1.rpt"));
                oRpt.SetDataSource(Session["Test"]);
                subReport = oRpt.Subreports["CR_Detail.rpt"];
                subReport.SetDataSource(Session["Detail"]);
                //将报表和报表浏览控件绑定
                CrystalReportViewer1.ReportSource = oRpt;
                CrystalReportViewer1.DataBind();
            }        }
        if (!Page.IsPostBack)
        { InitData(); }
    }
    public void InitData()
    {
        BLL.ARBIS abs=new BLL.ARBIS();
        DataTable dt = BLL.ARBIS.getLocation(new Hashtable());
        DDL_Location.Items.Clear();
        foreach (DataRow dr in dt.Rows)
        {
            DDL_Location.Items.Add(new ListItem(dr["Location"].ToString(), dr["Location"].ToString()));
        }
    }
    private void ConfigueRpt()
    {
        CrystalDecisions.CrystalReports.Engine.Database crDatabase;
        CrystalDecisions.CrystalReports.Engine.Table crTable;
        TableLogOnInfo dbConn = new TableLogOnInfo();        oRpt.Load(Server.MapPath("~/Report/CR_1.rpt"));    
        crDatabase = oRpt.Database;
        //定义一个arrtables对象数组
        object[] arrTables = new object[1];
        crDatabase.Tables.CopyTo(arrTables, 0);
        crTable = (CrystalDecisions.CrystalReports.Engine.Table)arrTables[0];
        dbConn = crTable.LogOnInfo;        //设置相关的登陆数据库的信息
        dbConn.ConnectionInfo.DatabaseName = "Billing";
        dbConn.ConnectionInfo.ServerName = "127.0.0.1";
        dbConn.ConnectionInfo.UserID = "sa";
        dbConn.ConnectionInfo.Password = "";        //将登陆的信息应用于crtable表对象
        crTable.ApplyLogOnInfo(dbConn);        //填充数据
        dbop da = new DAL.dbop();
       
        string sql = "select BYear,BMonth, Location,ActivityType ,SUM(Amount) as SubTotal ," +
"ActivityText from table1 where Location='" + DDL_Location.SelectedItem.Value + "'" +
 "GROUP By ActivityType,ActivityText,Location,BYear,BMonth";        string sql2 = "select BYear,BMonth, Location,Costcenter,Owner,ActivityType,ActivityText,Amount as SubTotal ," +
       "ServiceProvider,Quantity,TicketNo,Requirement,Solution,Department,Price from  table1 where Location='" + DDL_Location.SelectedItem.Value + "'";        DataTable AdvisoryData = da.GetDataTable(sql);
        DataTable AdvisoryData2=da.GetDataTable(sql2);
        Session.Add("Test", AdvisoryData);
        Session.Add("Detail",AdvisoryData2);
        oRpt.SetDataSource(Session["Test"]);
        subReport = oRpt.Subreports["CR_Detail.rpt"];
        subReport.SetDataSource(Session["Detail"]);
        //oRpt.SetDataSource(AdvisoryData);
        //将报表和报表浏览控件绑定
        CrystalReportViewer1.ReportSource = oRpt;
        CrystalReportViewer1.DataBind();
        //传递参数
        //setReportParameters();    }
  
    protected void Button1_Click(object sender, EventArgs e)
    {
        ConfigueRpt();
    }
    private void Page_Unload(object sender, EventArgs e)
    {
        oRpt.Dispose();
    }
             }

解决方案 »

  1.   

    啥版本的水晶报表和啥版本的VS.Net如果是2008的话,把Page_load事件放到page_init里并且,把 if (!Page.IsCallback)。。这个逻辑去掉,把里面的代码放到外面来
      

  2.   

    同上
    我用的是VS.Net自带的水晶报表
    就是放在外边
    if (!IsPostBack)
    {}
      

  3.   

    2008的VS和程序员版本的水晶报表设计器。我这个是要按一个Button然后显示出水晶报表,
      

  4.   

    。。仔细看了下代码,不知道大家从哪里看到的代码,这么做子报表的传值。。还真是让人晕。
    private void ConfigueRpt()这个事件里的
    //将报表和报表浏览控件绑定
            CrystalReportViewer1.ReportSource = oRpt;
            CrystalReportViewer1.DataBind();
    Session["myRpt"]=oRpt;增加一个
    Page_init事件
    代码如下if (Session["myRpt"]!=null)
    {
     CrystalReportViewer1.ReportSource = (ReportDocument)Session["myRpt"];
      

  5.   

    谢谢阿泰,不过不要好意思,我是个新人,不是很明白,如果不这样传递子报表的值,该怎么做呢?我照你说的方法做了,可是子报表反而没有数据了。代码如下。public partial class ARBIS_Report : System.Web.UI.Page
    {
        ReportDocument oRpt = new ReportDocument();
        ReportDocument subReport = new ReportDocument();
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            { InitData(); }
        }
        public void InitData()
        {      
            if (!Page.IsCallback)
            {
                if (Session["Test"] != null && Session["Detail"] != null)
                {
                    oRpt.Load(Server.MapPath("~/Report/CR_1.rpt"));
                    oRpt.SetDataSource(Session["Test"]);
                    subReport = oRpt.Subreports["CR_Detail.rpt"];
                    subReport.SetDataSource(Session["Detail"]);
       
                    CrystalReportViewer1.ReportSource = oRpt;
                    CrystalReportViewer1.DataBind();
                }        }
            BLL.ARBIS abs=new BLL.ARBIS();
            DataTable dt = BLL.ARBIS.getLocation(new Hashtable());
            DDL_Location.Items.Clear();
            foreach (DataRow dr in dt.Rows)
            {
                DDL_Location.Items.Add(new ListItem(dr["Location"].ToString(), dr["Location"].ToString()));
            }
            if (Session["myRpt"] != null)
            {
                CrystalReportViewer1.ReportSource = (ReportDocument)Session["myRpt"];
            }
        }
        private void ConfigueRpt()
        {        CrystalDecisions.CrystalReports.Engine.Database crDatabase;
            CrystalDecisions.CrystalReports.Engine.Table crTable;
            TableLogOnInfo dbConn = new TableLogOnInfo();        oRpt.Load(Server.MapPath("~/Report/CR_1.rpt"));        crDatabase = oRpt.Database;
            //定义一个arrtables对象数组
            object[] arrTables = new object[1];
            crDatabase.Tables.CopyTo(arrTables, 0);
            crTable = (CrystalDecisions.CrystalReports.Engine.Table)arrTables[0];
            dbConn = crTable.LogOnInfo;
            dbConn.ConnectionInfo.DatabaseName = "Billing";
            dbConn.ConnectionInfo.ServerName = "127.0.0.1";
            dbConn.ConnectionInfo.UserID = "sa";
            dbConn.ConnectionInfo.Password = "";        crTable.ApplyLogOnInfo(dbConn);        dbop da = new DAL.dbop();
           
            string sql = "select BYear,BMonth, Location,ActivityType ,SUM(Amount) as SubTotal ," +
    "ActivityText from View where Location='" + DDL_Location.SelectedItem.Value + "'" +
     "GROUP By ActivityType,ActivityText,Location,BYear,BMonth";        string sql2 = "select BYear,BMonth, Location,Costcenter,Owner,ActivityType,ActivityText,Amount as SubTotal ," +
           "ServiceProvider,Quantity,TicketNo,Requirement,Solution,Department,Price from  View where Location='" + DDL_Location.SelectedItem.Value + "'";        DataTable AdvisoryData = da.GetDataTable(sql);
            DataTable AdvisoryData2=da.GetDataTable(sql2);        Session.Add("Test", AdvisoryData);
            Session.Add("Detail", AdvisoryData2);        oRpt.SetDataSource(Session["Test"]);
            subReport = oRpt.Subreports["CR_Detail.rpt"];
            subReport.SetDataSource(Session["Detail"]);
            oRpt.SetDataSource(AdvisoryData);
            //将报表和报表浏览控件绑定
            Session["myRpt"] = oRpt;
            CrystalReportViewer1.ReportSource = oRpt;
            CrystalReportViewer1.DataBind();
        }
      
        protected void Button1_Click(object sender, EventArgs e)
        {
            ConfigueRpt();
        }
        private void Page_Unload(object sender, EventArgs e)
        {
            oRpt.Dispose();
        }
                 }
      

  6.   

    上面有点错,init里面没有if (!Page.IsCallback)的。
      

  7.   

    错了,我代码写错了,
       if (Session["Test"] != null && Session["Detail"] != null)
                {
                    oRpt.Load(Server.MapPath("~/Report/CR_1.rpt"));
                    oRpt.SetDataSource(Session["Test"]);
                    subReport = oRpt.Subreports["CR_Detail.rpt"];
                    subReport.SetDataSource(Session["Detail"]);
       
                    CrystalReportViewer1.ReportSource = oRpt;
                    CrystalReportViewer1.DataBind();
                }        }        if (Session["myRpt"] != null)
            {
                CrystalReportViewer1.ReportSource = (ReportDocument)Session["myRpt"];
            }这一段应该是放在    public void page_init(object sender, EventArgs e)里面的,这样,运行出错了,
    是这段:   CrystalReportViewer1.ReportSource =(ReportDocument)Session["myRpt"];
    错误是:”object reference not set to an instance of an object“
      

  8.   

    CrystalReportViewer1.ReportSource = (ReportDocument)Session["myRpt"];
    这句话是不是有点问题啊?怎么报错啊?救命啊
      

  9.   

    报错应该是因为 (ReportDocument)Session["myRpt"] 里没有正确保存rpt对象吧看了你的代码,
    你的代码思路是比较乱的(ConfigueRpt里面)
    你的模板是怎么做的呢?用了xsd还是直连了数据库?
    代码又是参考哪里来的呢?呵呵
      

  10.   

    用的是xsd,
    代码是网上混乱参考过来的,都不记得出自哪里了。。我就是一张水晶报表里有一个子报表,但是子报表和主报表的来源又不同。
      

  11.   

    yiyi_fish:有时间的话,看一下
    http://topic.csdn.net/u/20081118/10/49a1751d-1d86-44e4-969f-a847c2316dd3.html
    这里面的一个视频操作,应该会有收获的。
      

  12.   

    谢谢你,这个视频我已经有了,可是这个视频里的子报表跟主报表是来自同一个dataset,我的子报表是“来自已有的报表”,并且数据集和主报表也不是一个。
    可能是我没表示清楚吧。