【问题标题】:Crystal Reports Programatically sort using two passed in parametersCrystal Reports 使用两个传入的参数以编程方式排序
【发布时间】:2011-01-11 18:48:57
【问题描述】:

我是 Crystal Reports 的新手,我可能没有使用最新的。我们使用VS2010/ASP.NET作为我们的主要编程环境,但是我们在VS2008中使用了集成的Crystal Reports 2008设计器,所以我在设计报表时需要切换到2008。我一直在通过在 IDE 中定义参数字段然后将它们传入来将参数传递给报告。我们有带有可排序的 GridView 的 ASP.NET 屏幕。数据显示在水晶报表上,但我必须匹配它的排序方式。我在谷歌上查了一下,发现thisthis article。我不知道如何使用这些代码 sn-ps。我们最好的选择似乎是我们的“报表控制器”类,这是 C# 中唯一可以使用 Crystal Reports 对象的地方。一个类如下所示:

public class CRMOCContactsController : ReportingBase
    {
        public CRMOCContactsController(DataSet reportData, NameValueCollection reportParams)
        {
            // Create an instance of the Crystal Report.
            this.Report = new Reports.CRMOCContacts();

            // Get the data 
            this.ReportData = reportData;

            foreach (string s in reportParams.AllKeys)
            {
                CRHelper.SetCurrentValuesForParameterField(this.Report.ParameterFields, s, reportParams[s]);
            }
        }

        protected override void SetDataSource()
        {
            this.Report.Database.Tables["ContactRecord"].SetDataSource(this.ReportData.Tables["ContactRecord"]);
            this.Report.Database.Tables["ContactSearchCriteria"].SetDataSource(this.ReportData.Tables["ContactSearchCriteria"]);
            this.Report.Database.Tables["SSIFields"].SetDataSource(this.ReportData.Tables["SSIFields"]);
        }

有谁知道我如何使用这些类型的类来做到这一点?一个参数是要排序的字段,另一个参数是方向。谢谢。向我展示代码真的很有帮助。

Tiago,我的浏览器被锁定,不允许我添加评论。 Crystal 代码的唯一位置是与每个报告一起自动生成的 C# 类。例如,上面引用的 Reports.CRMOCContacts() 类。这是由工具自动生成的,无法修改: //------------------------------------------------ ------------------------------ // // 此代码由工具生成。 // 运行时版本:2.0.50727.3603 // // 对该文件的更改可能会导致不正确的行为,并且会丢失 // 重新生成代码。 // //------------------------------------------------ ------------------------------

我看到的唯一引用是 ReportDocument: 公共虚拟 CrystalDecisions.CrystalReports.Engine.ReportDocument CreateReport() { CRMOCContacts rpt = 新的 CRMOCContacts(); rpt.Site = 这个.Site; 返回 rpt; }

我想通了。如果我将 this.Report 视为 ReportDocument 并添加以下库,则 CRMOCContactsController 中的代码可以是 Crystal 代码: 使用 CrystalDecisions.Shared; 使用 CrystalDecisions.ReportSource; 使用 CrystalDecisions.CrystalReports.Engine;

然后我可以这样做: 字段定义字段定义 = null;; FieldDef = this.Report.Database.Tables[0].Fields[]; this.Report.DataDefinition.SortFields[0].Field = FieldDef; this.Report.DataDefinition.SortFields[0].SortDirection = CrystalDecisions.Shared.SortDirection.AscendingOrder;

我只是不知道如何传入sortField?什么格式?

【问题讨论】:

    标签: c# crystal-reports


    【解决方案1】:
    ReportDocument objReport = new ReportDocument();
    objReport.Load("Your report path");
    FieldDefinition FieldDef;
    FieldDef = objReport .Database.Tables[0].Fields[sortField];
    objReport.DataDefinition.SortFields[0].Field = FieldDef;
    objReport.DataDefinition.SortFields[0].SortDirection = CrystalDecisions.Shared.SortDirection.DescendingOrder;
    

    【讨论】:

      【解决方案2】:

      Sam,我不知道你的助手类是如何工作的。看起来您正在将数据集传递给 ReportDocument,对吗?如果是这种情况,您可以传递给 ReportDocument 排序的数据表,它会保持行的顺序。

      在这里,我将一个数据集传递给我的报告,该数据集是从一个存储过程创建的,该存储过程接收 order by 作为参数。数据集已排序,因此报告也会显示已排序的信息。

      【讨论】:

      • 这对我来说行不通。该报告确实知道显示已排序的数据集。
      • Sam Gentile,您发布的代码没有显示水晶类。我检查了您在问题中链接的 sn-ps,它们看起来非常简单。您在代码中的哪个位置定义 ReportDocument?我认为会有我们可以进行分类的地方。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      • 2013-03-09
      • 2013-12-12
      相关资源
      最近更新 更多