【问题标题】:Binding object data source with nested list objects in RDLC将对象数据源与 RDLC 中的嵌套列表对象绑定
【发布时间】:2012-01-17 13:01:10
【问题描述】:

我知道我们可以将对象数据源绑定到 RDLC。我正在尝试绑定如下对象:

public class ContactReportData
{
   public string ContactReportHeading{get;set;}
   public string ContactReportSubHeading{get;set;}
   public List<Contact> ContactDetails{get;set;}
}

public class Contact    {
   public string ContactName{get;set;}
   public string ContactDesignation{get;set;}
}

当设置为 RDLC 时,它一次只会找到一个数据集,比如 ContactReportData(没有联系人列表)或联系人。我想那是因为报告需要它是这样的。

我想要的是将报告中的数据显示为: 联系报告标题 联系报告子标题 联系人的表格形式 - 联系人姓名、职务。

我本可以将其作为静态报告数据的详细信息并仅绑定联系人列表,但我所拥有的是我面临问题的联系人报告列表。

【问题讨论】:

  • 这里有同样的问题。我开始在我的主表中添加一个列表,但不知道如何绑定它。 OT:我希望你已经安装了 VS2010 SP1。这就是我在寻找答案时首先想到的。

标签: c# rdlc


【解决方案1】:

我通过使我的对象重新调整为具有联系人的所有属性以及父对象的附加属性的匿名对象的平面列表来解决这个问题。然后在 RDLC 报告中,添加一个表格并绑定联系人对象的属性,然后将组添加到父属性。

总结是为了让这样的布局你需要添加分组。

【讨论】:

  • 您能否进一步解释一下您如何遍历 RDLC 上的列表?我已经尝试过了,它没有呈现价值。添加分组是什么意思?
【解决方案2】:

您真的不必将对象弄平。相反,您可以将多个数据集绑定到报告中。然后您可以通过代码将多个报表数据源分配给您的报表。这是工作示例:

List<Loan> loans = new List<Loan>();
loans.Add(GetLoanByLoanNumber(loanNumber));

LocalReport report = new LocalReport();
report.ReportPath = HostingEnvironment.MapPath("~/bin/Report/Receipt.rdlc");

ReportDataSource loanDetailsDataSource = new ReportDataSource();
loanDetailsDataSource.Name = "LoanDataSet"; //This refers to the dataset name in the RDLC file
loanDetailsDataSource.Value = loans;
report.DataSources.Add(loanDetailsDataSource);

ReportDataSource loanItemsDataSource = new ReportDataSource();
loanItemsDataSource.Name = "LoanItemsDataSet";
loanItemsDataSource.Value = loans[0].loanItems;
report.DataSources.Add(loanItemsDataSource);

ReportDataSource principalPaymentDataSource = new ReportDataSource();
principalPaymentDataSource.Name = "PrincipalPaymentDataSet";
principalPaymentDataSource.Value = loans[0].principalPayments;
report.DataSources.Add(principalPaymentDataSource);

ReportDataSource interestPaymentDataSource = new ReportDataSource();
interestPaymentDataSource.Name = "InterestPaymentDataSet";
interestPaymentDataSource.Value = loans[0].interestPayments;
report.DataSources.Add(interestPaymentDataSource);

希望这会对某人有所帮助!

【讨论】:

  • 如果外借列表中有多个项目怎么办?
  • @BlueM Loans 不必是一个列表。它也可以是具有一组属性的类,每个属性都可以是一个列表。
【解决方案3】:

这可能不是一个合适的答案,但是当我觉得缺乏关于这个主题的材料时,鼓励我发布我的发现。

假设我在父对象中有一个嵌套的子对象列表。这是一种很常见的情况,例如,如果您有一个订单对象(父级),您可能会有一个订单项(子级)列表,如何使用 rdlc 显示所有信息?有两种方式,1是使用子报表,2是使用分组。我意识到他们都可以实现相同的目标,即在报告中显示详细信息列表。

public class Order{
    public int OrderID {get; set;}
    public string Descrpition {get; set;}
    public List<OrderItem> OrderItems {get; set;}
}
public class OrderItem{
    public int OrderItemID {get; set;}
    public decimal Price{get; set;}
}

最简单的方法是使用分组。通过分组,您必须创建一个包含父子属性的新数据类型。我相信这种方式也适用于多级嵌套对象列表。这听起来可能很愚蠢,但大多数时候您还是必须创建一个新的数据类型,因为您需要在报表上显示的类型与业务对象不同:

public class OrderReport{
    public int OrderID {get; set;}
    public string Description {get; set;}
    public int OrderItemID {get; set;}
    public decimal Price {get; set;}
}

然后在 rdlc 上,你只需要创建父行组和一个子行组,Parent 应该按 OrderID 分组,子行组应该设置为“显示详细信息”。我认为您可以多次执行此操作以实现对象的多级嵌套列表。

【讨论】:

    【解决方案4】:

    @Bharath 说您可以为一个报告分配多个数据源,这一点非常正确,并且该答案中的代码涵盖了将数据分配给报告。

    如果您最初是通过设计器创建报表,则报表有两个数据源如下所示:

    要获取第二个数据集,请右键单击树中的 Datasets 文件夹并选择“添加数据集..”

    然后您可以在报告中使用两个数据集中的字段;在上面的屏幕截图中,TextBoxes 链接到 DataSet1,表格是从 DataSet2 填充的。

    【讨论】:

    • 如果 Dataset1 是父数据列表并且 Dataset2 表示一对多父子列表,这是否有效?
    • @PaulGibson 我不知道,我没试过,我怕
    • 这行得通吗?我仍然无法指定第三个数据集。
    【解决方案5】:

    对象列表绑定为常规报告字段,但类(定义此对象)应使用[Serializable] 属性进行标记。
    在报告中,字段用作=First(Fields!NameOfListProperty.Value.Count, "DataSet1")Fields!NameOfListProperty.Value(0).Item,例如作为数据列表的常规属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多