Я хотел задокументировать это для всех, кто появляется в поисках ответа:
private readonly CrystalReportViewer reportViewer = new CrystalReportViewer();
...
this.reportViewer.ReportSource = @"C:\PathToReport\Report.rpt";
using (var crystalReport = new ReportDocument())
{
foreach (DataRow row in dataSet.Tables[0].Rows)
{
var customerId = int.Parse(row["customerId"].ToString());
var isCurrent = bool.Parse(row["isCurrent"].ToString());
var totalSales = int.Parse(row["totalSales"].ToString());
// generate the report for each row
this.CreateReport(customerId, isCurrent, totalSales, crystalReport);
}
}
private void CreateReport(int customerId, bool isCurrent, int totalSales, ReportDocument crystalReport)
{
crystalReport.Load(this.reportViewer.ReportSource.ToString());
crystalReport.SetParameterValue("customerId", customerId);
crystalReport.SetParameterValue("isCurrent", isCurrent);
crystalReport.SetParameterValue("TotalSales", totalSales);
var fileName = string.Format("EndOfYear_{0}_{1}.pdf", customerId, isCurrent ? 1 : 0);
var outputPath = Path.Combine(this.txtOutputDirectory.Text, fileName);
crystalReport.ExportToDisk(ExportFormatType.PortableDocFormat, outputPath);
}
Ссылки:
CrystalDecisions.CrystalReports.Design
CrystalDecisions.CrystalReports.Engine
Этот код выдает имя файла примерно так:
"EndOfYear_123456_1.pdf"
Конечно, можно генерировать объект отчета для каждой строки, а не передавать его, но это немного замедляет работу. Насколько я мог видеть, повторное использование одного и того же объекта отчета не оказало какого-либо негативного влияния и ускорило процесс в десять раз.
Единственное, что вам нужно, это как подготовить отчет Crystal, который выходит за рамки этого руководства. Удачи!