3

我想重用相同的 RDLC 来根据格式字段显示不同的表格。IEnumerable<IGrouping<string, Row>>但是当数据源的返回类型已经分组时,我的报告没有显示任何内容。

因此,如果用户选择格式 A,报告将显示按某些列分组的表格,如果用户选择格式 B,报告将显示按其他内容分组的表格

我的计划 B 是简单地将数据源作为 Enumerable 传递,然后在报告本身中排序,但我希望在代码中包含所有逻辑,而不是在 RDLC 中。

我正在使用自定义数据集来构建报告,如下所示:

    public byte[] GetReport(ReportFormat reportFormat)
    {
        MyReportDataSource myReportDataSource = GetMyReportDataSource(reportFormat);

        ReportDataSource dsDetails = GetDetailsDataSource(myReportDataSource);
        ReportDataSource dsRows = GetRowsDataSource(myReportDataSource);

        LocalReport localReport = new LocalReport();
        localReport.ReportPath = "pathToMyRdlc.rdlc";
        localReport.DataSources.Add(dsDetails);
        localReport.DataSources.Add(dsRows);

        Warning[] warnings;
        string encoding;
        string fileNameExtension;
        string[] streams;

        byte[] reportBytes = localReport.Render("pdf", null, PageCountMode.Actual,
                        out mimeType, out encoding, out fileNameExtension, out streams, out warnings);

        return reportBytes;
    }

    private MyReportDataSource GetMyReportDataSource(ReportFormat reportFormat)
    {
        MyReportDataSource r = new MyReportDataSource();
        r.ReportFormat = ReportFormat.A;
        //some test rows
        Row row1 = new Row
        {
            Name = "Joe",
            LastName = "Doe",
            Age = 42
        };
        Row row2 = new Row
        {
            Name = "Jane",
            LastName = "Doe",
            Age = 26
        };
        Row row3 = new Row
        {
            Name = "Joe",
            LastName = "Smith",
            Age = 31
        };
        r.AddRow(row1);
        r.AddRow(row2);
        r.AddRow(row3);
        return r;
    }

    private ReportDataSource GetDetailsDataSource(MyReportDataSource myReportDataSource)
    {
        //ReportDataSource only accepts dataTable or IEnumerable, use IEnumerable but with single element as workaround
        List<MyReportDataSource> listSingleItem = new List<MyReportDataSource>();
        listSingleItem.Add(myReportDataSource);

        ReportDataSource detailsDataSource = new ReportDataSource("DSDetails", listSingleItem.AsEnumerable());
        return detailsDataSource;
    }

    private ReportDataSource GetDeclarationRowsDataSource(MyReportDataSource myReportDataSource)
    {
        ReportDataSource rowsDataSource = new ReportDataSource("DSRows", myDataSource.Rows);
        return rowsDataSource;
    }

所以基本上我将两个数据源传递给本地报告,一个DSDetails用于详细信息(指定格式在哪里),另一个DSRows用于内部 Enumerable,其中包含我想在表中显示的数据。这将是我的自定义数据源对象

public class DeclarationReportDataSource
{
    public ReportFormat ReportFormat { get; set; }

    private decimal _totalAge;
    public decimal TotalAge
    {
        get
        {
            return Math.Round(this._totalAge, 2);
        }
    }
    private List<Row> _Rows = new List<Row>();
    //HERE IS THE PROBLEM
    //This is the method that returns an IEnumerable ordered by
    //depending on the format
    //There is no problem to display data if I return an IEnumerable<Row>
    public IEnumerable<IGrouping<string, Row>> Rows
    {
        get
        {
            if (this.ReportFormat == ReportFormat.A)
            {
                return this._Rows.GroupBy(r => r.Name);
            }
            //else group by different field
            return this._Rows.GroupBy(r => r.LastName);
        }
    }

    public void AddRow(Row row)
    {
        this._Rows.Add(row);
        this._totalAge += row.Age;
    }
}

我对 RDLC 很陌生,所以任何关于如何做类似事情的指导或好的文章都将不胜感激。谢谢

更新我在报告中的表格显示 2 个空行,因此代码中的 group by 效果很好,但行不显示任何内容。所以我怀疑我错过了一些关于如何呈现分组行的概念。我会继续调查。

4

0 回答 0