刚学水晶报表,报表来源是在程序中将一个dataset动态绑定到报表中,可是报表显示不出数据,问题出在哪里呢?
代码段如下:
CrystalReportViewer crystalReportViewer1;
CrystalReport1 cr1 = new CrystalReport1();
DataSet ds = new DataSet();
DataTable  dt  =  new  DataTable("Customers");dc  =  dt.Columns.Add(  "CustomerID",  System.Type.GetType(  "System.Int32"  )  );  
dc.Unique  =  true; 
 
dc  =  dt.Columns.Add(  "CustomerName",  System.Type.GetType(  "System.String"  )  );  
dc.Caption  =  "Name";  
 
dc  =  dt.Columns.Add(  "CreditLimit",  System.Type.GetType(  "System.Double"  )  );  
dc.DefaultValue  =  0;  
dc.Caption  =  "Limit";  
 
for( int i=0 ;i<= 20;i++)
{
    dt.Rows.Add(  new  object[]  {i,  "第"+i.ToString() +"行", 10+i } );
}
 
ds.Tables.Add(dt);
cr1.SetDataSource( ds );
crystalReportViewer1.ReportSource = cr1;

解决方案 »

  1.   

    没有加载水晶报表,应该加载一个.RPT文件的
      

  2.   

    是Crystal Report 9,我添加新项目后,在设计时候选择为空,文件名为 CrystalReport1.rpt
      

  3.   

    cr1.SetDataSource( ds.Tables["Customers"] );
      

  4.   

    回NWC:
    可采用cr1.SetDataSource( ds.Tables["Customers"] );之后,运行出现异常如下:
     未处理的“CrystalDecisions.CrystalReports.Engine.InvalidArgumentException”类型的异常出现在 crystaldecisions.crystalreports.engine.dll 中。其他信息: 文件 C:\....\Temp\temp_2ed02530-f015-4802-aaea-dc3ba735ca85.rpt 内出错:
    无效表号。
      

  5.   

    有个Crystal Document 对象的,它好像有个叫ReportSource的属性,你把存的报表文件位置赋给他,然后把你那个Dataset也赋给他,然后把它传给你那个ReprotView 就可以了
    身边没MSDN,没法仔细说,但是你在文档区搜一下,应该可以搜到一大把资料
      

  6.   

    在设计阶段,我添加的报表 CrystalReport1.rpt是一个空报表,
      

  7.   

    你意思就是 CrystalReport1.rpt 这个报表中的元素你是动态生成的?那你直接在
    cr1.SetDataSource 里把你的Datatable赋给他
    cr1.SetDataSource( dt );
      

  8.   

    是的,在添加新项CrystalReport1.rpt后,设计时是作为空白报表的,没有设定任何数据源,然后是在程序运行的时候:
      new 了一个dataset 和datatable ,因为我的目的是把datatable中的数据通过crystalReportViewer1显示出来,不过结果让我失望,显示为空
      也不知道是不是可行呢
      

  9.   

    我不敢肯定你动态生成CrystalReport内元素的功能实现了没有,那个是要调用其他类库来完成的,如果你那个功能没实现,则在CrystalReport中根本没你那个table对象,你强行赋值进去,自然会出错了
      

  10.   

    这样设置ds.Tables.Add(dt);
     cr1.SetDataSource( ds );就不会有异常,但如果按你说的:
     cr1.SetDataSource( dt );
    就会有异常出现;你说的“动态生成CrystalReport内元素的功能”,能不能解析清楚一些呢,可能问题就出在这里吧
      

  11.   

    引用:
    回NWC:
    可采用cr1.SetDataSource( ds.Tables["Customers"] );之后,运行出现异常如下:
     未处理的“CrystalDecisions.CrystalReports.Engine.InvalidArgumentException”类型的异常出现在 crystaldecisions.crystalreports.engine.dll 中。其他信息: 文件 C:\....\Temp\temp_2ed02530-f015-4802-aaea-dc3ba735ca85.rpt 内出错:
    无效表号。
    在设置数据源表名的时候( cr1.SetDataSource( ds.Tables["Customers"] ) )必须与你建立的数据集中的表名做到高度一致,即 表名、列名等完全一致。
      

  12.   

    你的水晶报表打了补丁没有,没打补丁用Dataset会出错的。
      

  13.   

    动态设置数据源(采用push方式)1.根据报表的结构字段,建立一个xsd文件,用来存放数据。2.新建一个报表,注意建立的时候要浏览到该xsd文件,   建好后找到该报表的属性"自定义工具",把原来的  "CrystalDecisions.VSDesigner.CodeGen.ReportCodeGenerator"  改为"CrystalDecisions.VSShell.CodeGen.ReportCodeGenerator"  这样就会产生一个按照你报表名命名的zsmxb.cs文件,其实就是下面的类zsmxb   同时建立一个页面,把CrystalReportViewer控件放到页面,   并且要在该页面文件的顶部申明一下报表的类,   public class Fr_zsmxb : System.Windows.Forms.Form
       {
            zsmxb crReportDocument;       .........3.建立报表结构   DataSet dss=new DataSet();
       DataTable dt=new DataTable("zsmxb");
       dt.Columns.Add("cchbh",System.Type.GetType("System.String"));
       dt.Columns.Add("nglf",System.Type.GetType("System.Decimal"));
       dt.Columns.Add("ncf",System.Type.GetType("System.Decimal"));
       dt.Columns.Add("nqyf",System.Type.GetType("System.Decimal"));
       dt.Columns.Add("nzsf",System.Type.GetType("System.Decimal"));
       dt.Columns.Add("ntcf",System.Type.GetType("System.Decimal"));
       dt.Columns.Add("ngz",System.Type.GetType("System.Decimal"));
       dt.Columns.Add("nzjf",System.Type.GetType("System.Decimal"));
       dt.Columns.Add("nylf",System.Type.GetType("System.Decimal"));
       dt.Columns.Add("nwxf",System.Type.GetType("System.Decimal"));
       dt.Columns.Add("nsy",System.Type.GetType("System.Decimal"));
       dt.Columns.Add("nqtf",System.Type.GetType("System.Decimal"));
       dt.Columns.Add("nxj",System.Type.GetType("System.Decimal"));
       dss.Tables.Add(dt);   注意:这里的DataTable dt=new DataTable("zsmxb");这句中表名"zsmxb"要和你的xsd文件中的表名要一样,  同时,dt的字段名、类型,都要和xsd文件一样,否则回产生"查询引擎错误"。4.为这个ds传入数据   for(int i=0;i<this.ds.Tables["zsmxb"].Rows.Count;i++)
       {
        DataRow dr=dt.NewRow();
        dr["cchbh"]=this.ds.Tables["zsmxb"].Rows[i]["cchbh"];
        dr["nglf"]=this.ds.Tables["zsmxb"].Rows[i]["nglf"];
        dr["ncf"]=this.ds.Tables["zsmxb"].Rows[i]["ncf"];
        dr["nqyf"]=this.ds.Tables["zsmxb"].Rows[i]["nqyf"];
        dr["nzsf"]=this.ds.Tables["zsmxb"].Rows[i]["nzsf"];
        dr["ntcf"]=this.ds.Tables["zsmxb"].Rows[i]["ntcf"];
        dr["ngz"]=this.ds.Tables["zsmxb"].Rows[i]["ngz"];
        dr["nzjf"]=this.ds.Tables["zsmxb"].Rows[i]["nzjf"];
        dr["nylf"]=0;
        dr["nwxf"]=0;
        dr["nsy"]=0;
        dr["nqtf"]=this.ds.Tables["zsmxb"].Rows[i]["nqtf"];
        dr["nxj"]=System.Convert.ToDecimal(dr["nglf"].ToString())+System.Convert.ToDecimal(dr["ncf"].ToString();       dt.Rows.Add(dr);
       } 这里的ds是同过查询得到的,这里只是举个例子。5.把得到的报表数据源dss绑定到水晶报表。   crReportDocument=new zsmxb();
       crReportDocument.SetDataSource(dss);
       crystalReportViewer1.ReportSource = crReportDocument;