【问题标题】:Designing reports at runtime在运行时设计报告
【发布时间】:2011-09-06 12:25:49
【问题描述】:

我正在开发一个 Windows 窗体应用程序,它有几个包含使用 vb.net 的 datagridviews 的窗口。客户最近想出了能够打印每个表的数据的愿望。

几个月前,我使用 Crystal 报表成功地设计和实施了我的第一个报表,我的第一直觉是使用 Crystal 报表来完成这项工作。但是,因为我已经确切地知道要在第一份报告中呈现哪些列和数据,所以我可以在设计报告时考虑到这一点,所以这没有问题。

现在,挑战是我事先不知道要在报告中打印的确切列数,所以恐怕我必须以编程方式设计报告,所以我的问题是;

  1. 是否有任何以编程方式设计报告的方法?例如,我可以只使用代码告诉水晶报表在详细信息部分放置一个“表格对象”,然后放置一个名为 X 的列,另一个名为 Y 的列吗?如果可能的话,有人可以指点我一些关于如何执行此操作或类似操作的示例代码吗?

  2. 如果 1 在水晶报表中是不可能的,有人可以指出我可以在其中实现 1 的其他报告软件,如果可能的话,如何实现?

  3. 我是在合理地解决问题,还是有更好、更简单的方法来实现客户的愿望?

顺便说一句,我已经提供了将表格导出到 excel 的可能性,客户可以根据需要从中打印它们,但似乎他们更喜欢外观更漂亮的带有徽标和东西的报表,就像水晶报表中可以实现的那样.

我将非常感谢在实现此功能方面的任何帮助。

【问题讨论】:

    标签: crystal-reports reporting report


    【解决方案1】:

    您有两种方法可以做到这一点,一种很难,另一种容易。首先,让我们把难点排除在外。 CR 有一个功能齐全的库,可让您几乎从头开始创建报告。它被称为 RAS 库。但它非常复杂,对于 Crystal 新手来说并不是最好的选择。

    下一个解决方案也是最简单的方法是创建一个包含您可能需要的所有可能字段的报表,然后使用 ReportObject 模型动态隐藏您不需要显示的字段。因此,如果您的报告中可以有 5 到 10 列,请在报告中创建全部 10 列。然后在您的应用程序中,如果您不需要第 10 列,请将其隐藏。像这样的:

    CrystalDecisions.CrystalReports.Engine.ReportDocument myReport;
    myReport.Load("..your file...");
    CrystalDecisions.CrystalReports.Engine.TextObject myField;
    myField =(CrystalDecisions.CrystalReports.Engine.TextObject)HealthRounds.ReportDefinition.ReportObjects["Field10"];
    myField.ObjectFormat.EnableSuppress = true;
    ...
    

    【讨论】:

      【解决方案2】:

      如果您需要它真正动态并且可能更简单,请查看list & label。 您需要做的示例看起来有些简单:

      Proj.Open( @“c:\Reports\artikel.lst” ,  LlDomFileMode .Create,
        LlDomAccessMode .ReadWrite, true );
      
      ObjectReportContainer container= new
        ObjectReportContainer (Proj.Objects);
      
      container.Position.Left = “0” ;
      container.Position.Top = “0” ;
      container.Position.Width = “150000” ;
      container.Position.Height = “200000” ;
      
      SubItemTable table = new SubItemTable
        (container.SubItems);
      table.TableID = “Customers” ;
      
      TableLineData dataLineNew = new
        TableLineData (table.Lines.Data);
      dataLineNew.Name = “Created dynamically” ;
      
      TableFieldText textCol = new
        TableFieldText (dataLineNew.Fields);
      textCol.Contents = “Product.No” ;
      
      TableFieldBarcode barcodeCol = new
        TableFieldBarcode (dataLineNew.Fields);
      barcodeCol.Contents = “Barcode(Product.No, ‘PDF417’)” ;
      
      Proj.Save();
      Proj.Close (); 
      

      More Details here...

      您至少需要“Professional”版本才能使用此功能。 我用这个成熟的软件做了一些不错的程序。

      【讨论】:

        【解决方案3】:

        这很容易做到,我只想告诉你新的方法来完成这个步骤:

        1. 将要显示的数据放入适配器,并将适配器数据放入数据集
        2. 在您的计算机驱动程序中生成file.html代码让c
        3. 根据数据集中的单元格和要显示的动态列的数据集标题将数据集中的数据填充到该文件中
        4. 用数据填充文件后打开 html 文件

        浏览器具有从文件打印预览打印页面内容的功能 这是动态报告,只需从 SQL 查询中获取您想要的数据

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-08
          相关资源
          最近更新 更多