请问如何设置子报表的数据源?当前已经可以显示出主报表,我的主报表设置如下:
            string sql = "SELECT * FROM Table";
            string ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("~/App_Data/test.mdb");
            DataSet ds = new DataSet();
            OleDbConnection Con = new OleDbConnection(ConString);
            OleDbCommand Cmd = new OleDbCommand(sql, Con);
            OleDbDataAdapter Ad = new OleDbDataAdapter();
            Ad.SelectCommand = Cmd;
            Ad.Fill(ds, "sql");
            CrystalReportSource1.ReportDocument.Load(Server.MapPath("~/Reports/report.rpt"));
            CrystalReportSource1.ReportDocument.SetDataSource(ds.Tables["sql"]);
            CrystalReportViewer1.ReportSource = CrystalReportSource1;

解决方案 »

  1.   

    http://topic.csdn.net/u/20070112/16/19d079c4-0852-4a3f-a5e5-cc028f5007d0.html
      

  2.   

    参照上面的连接仍然搞不定,那个cr_cljdrx是什么?哪位能帮忙做个能运行的例子?谢谢!  private       void       Page_Load(object       sender,       System.EventArgs       e)       
        {       
        OleDbConnection       myconnect=new       OleDbConnection(ConfigurationSettings.AppSettings[ "connstr "]);       
        string       sqlstr1= "           SELECT       PLACE_ORDER_DETAIL.PLACE_ORDER_NO,PLACE_ORDER_DETAIL.PRODCODE,PLACE_ORDER_DETAIL.PRO_NAME,PLACE_ORDER_DETAIL.PRO_SPEC,PLACE_ORDER_DETAIL.COLOR,PLACE_ORDER_DETAIL.UNIT,PLACE_ORDER_DETAIL.ORDER_QTY           FROM       PLACE_ORDER_DETAIL               WHERE       PLACE_ORDER_DETAIL.PLACE_ORDER_NO       =       '04-110 ' ";               
        OleDbDataAdapter       myadapter=new       OleDbDataAdapter(sqlstr1,myconnect);       
        DataSet       mydataset=new       DataSet();       
        myadapter.Fill(mydataset, "first ");       
        cr_cljdrx       oRpt=new       cr_cljdrx();//主报表       空白       无数据           
                                                                                                                        cljdrx       oRpt1=new       cljdrx1();//子报表       ,只把它插入到了主报表中       
        oRpt1.SetDataSource(mydataset.Tables[ "first "]);       //绑定子报表数据       
        CrystalReportViewer1.ReportSource=oRpt;//显示报表       
            
            
        //       在此处放置用户代码以初始化页面       
        }
     CrystalDecisions.CrystalReports.Engine.ReportDocument       rpt=new       CrystalDecisions.CrystalReports.Engine.ReportDocument();       
            
        rpt.SetDataSource( "报表数据源 ");       
            
        rpt.OpenSubreport( "子报表名称 ").SetDataSource( "子报表数据源 ");
      

  3.   

    看下这段代码using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using CrystalDecisions.CrystalReports.Engine;
    using CrystalDecisions.Shared;namespace CS_Win_RDObjMod_DBLogonSubrpt
    {
        public partial class Form1 : Form
        {
            private ReportDocument northwindCustomersReport;        public Form1()
            {
                InitializeComponent();
            }        private void ConfigureCrystalReports()
            {
                northwindCustomersReport = new ReportDocument();
                string reportPath = Application.StartupPath + "\\" + "NorthwindCustomers.rpt";
                northwindCustomersReport.Load(reportPath);            ConnectionInfo connectionInfo = new ConnectionInfo();
                connectionInfo.ServerName = "ENXP-50701E";
                connectionInfo.DatabaseName = "Northwind";
                connectionInfo.IntegratedSecurity = true;
                SetDBLogonForReport(connectionInfo, northwindCustomersReport);            SetDBLogonForSubreports(connectionInfo, northwindCustomersReport);            crystalReportViewer.ReportSource = northwindCustomersReport;
            }        private void Form1_Load(object sender, EventArgs e)
            {
                ConfigureCrystalReports();
            }        private void crystalReportViewer_Load(object sender, EventArgs e)
            {        }        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);            }        }        private void SetDBLogonForSubreports(ConnectionInfo connectionInfo, ReportDocument reportDocument)
            {
                Sections sections = reportDocument.ReportDefinition.Sections;
                foreach (Section section in sections)
                {
                    ReportObjects reportObjects = section.ReportObjects;
                    foreach (ReportObject reportObject in reportObjects)
                    {
                        if (reportObject.Kind == ReportObjectKind.SubreportObject)
                        {
                            SubreportObject subreportObject = (SubreportObject)reportObject;
                            ReportDocument subReportDocument = subreportObject.OpenSubreport(subreportObject.SubreportName);
                            SetDBLogonForReport(connectionInfo, subReportDocument);                    }
                    }            }        }
        }
    }
      

  4.   

    阿泰给的例子,我连不上数据库,现在我又重新做了一个,但是仍然是只显示主报表,子报表不显示,经过调试发现dataSet那里是有数据的,另外,数据库用的是Access,能否帮助修改下面的代码:    private void ConfigureCrystalReports()
        {
            UsersReport = new ReportDocument();
            string reportPath = Server.MapPath("~/Reports/Report.rpt");
            UsersReport.Load(reportPath);
            DataSet dataSet = new DataSet();
           
            OleDbConnection cn = new OleDbConnection(ConString);        OleDbDataAdapter da = new OleDbDataAdapter("SELECT Name,Users,Country,COUNT(*) as total FROM (select distinct Name,T_Name,Country,Users from tblList) group by Name,Country,Users", cn);
            da.Fill(dataSet, "List");        OleDbDataAdapter da2 = new OleDbDataAdapter("SELECT Name,Country,COUNT(*) as total FROM (select distinct Name,T_Name,Country from tblList) group by Name,Country", cn);
            da2.Fill(dataSet, "tblList");        UsersReport.OpenSubreport("SubReport.rpt").SetDataSource(dataSet.Tables["tblList"]);        UsersReport.SetDataSource(dataSet.Tables["List"]);
            CrystalReportViewer1.ReportSource = UsersReport;
            CrystalReportViewer1.DataBind();
        }
      

  5.   

    -->UsersReport.OpenSubreport("SubReport.rpt").SetDataSource(dataSet.Tables["tblList"]); 将子报表嵌入到主报表,不要使用这种方式(如果你的项目允许的话),假设你用了跟主报表相同的dataset里的datatable 设计的子报表,那么就很简单
    OleDbDataAdapter da2 = new OleDbDataAdapter(子报表SQL, cn);
    da2.Fill(dataSet, "子报表用的表名");即可达到效果另外你上面的语句,可能应该是这样,   是子报表名,而不是子报表文件名
    UsersReport.OpenSubreport("SubReport").SetDataSource(dataSet.Tables["tblList"]); 
      

  6.   

    阿泰,那个子报表名就是SubReport.rpt,没有错.另外,根据你说的那样
    OleDbDataAdapter da2 = new OleDbDataAdapter(子报表SQL, cn); 
    da2.Fill(dataSet, "子报表用的表名"); 是不是就去掉该句UsersReport.OpenSubreport("SubReport.rpt").SetDataSource(dataSet.Tables["tblList"]); 但是去掉它后仍然不能显示另一个子报表?你说的那样把da2填充进去,是不是就显示在一个主报表里面了?
      

  7.   

    能把工程发出来看看吗?呵呵。babyt#163.com