如何使用POCO /自定义业务对象创建包含父子孙关系的报告?
public class Invoice
{
public List<Account> Accounts { get; set; }
}
public class Account
{
public List<LineItem> LineItems { get; set; }
}
public void GenerateReport()
{
var localReport = new LocalReport();
localReport.LoadReportDefinition(GetEmbeddedResource("Invoice.rdlc"));
localReport.DataSources.Add(new ReportDataSource("InvoiceDataset", new List<Invoice> { invoices }));
}
最好使用“子报表”上的“表”和“列表”控件。具有本地处理功能的Reporting Services v10(.rdlc文件)。
答案 0 :(得分:8)
<强> Invoice.rdlc 强>
<强> Account.rdlc 强>
<强> LineItem.rdlc 强>
以PDF格式生成此报告:
public byte[] GenerateInvoicePdf(Invoice invoice)
{
var localReport = new LocalReport();
localReport.LoadReportDefinition(GetEmbeddedResource("Invoice.rdlc"));
localReport.LoadSubreportDefinition("Account", GetEmbeddedResource("Account.rdlc"));
localReport.LoadSubreportDefinition("LineItem", GetEmbeddedResource("LineItem.rdlc"));
var datasource = new List<Invoice> {invoice};
localReport.DataSources.Add(new ReportDataSource("InvoiceDataset", datasource));
localReport.SubreportProcessing +=
(o, args) =>
{
if (args.ReportPath == "Account")
{
var invoiceId = long.Parse(args.Parameters["InvoiceId"].Values[0]);
var invoice = datasource.First(x => x.InvoiceId == invoiceId);
args.DataSources.Add(new ReportDataSource("AccountDataset", invoice.Accounts));
}
else if (args.ReportPath == "LineItem")
{
var invoiceId = long.Parse(args.Parameters["InvoiceId"].Values[0]);
var accountId = long.Parse(args.Parameters["AccountId"].Values[0]);
var invoice = datasource.First(x => x.InvoiceId == invoiceId);
var account = invoice.Accounts.First(x => x.AccountId == accountId);
args.DataSources.Add(new ReportDataSource("LineItemDataset", account.LineItems));
}
};
return localReport.Render("pdf");
}