创建包含多个表的rdlc报告(一对多关系)

时间:2018-02-17 17:27:00

标签: c# .net entity-framework report rdlc

所以,我是rdlc的新手(并且实际上报道了)。我有一个与另一个表有一对多关系的表,我试图在rdlc报告中将它们表示为每个项的多个表

注意:这些表最初是使用实体框架代码优先创建的。

以下是两个表(和父表)

Quotation model

现在,通常如果我只有[Quotation]和一些[QuotationItem],我只需添加报告顶部[Quotation]的信息,以及来自每个[QuotationItem]将在表格(Tablix)中的一行中表示。

问题:每个[QuotationItem]有许多 [QuotationItemQuantity](目前为三个),他们也需要代表。< / p>

所以,我的报告应该是这样的:

Report

但我仍然坚持如何为每个项目(QuotationItem)显示多个表(或列表和表)。我在列表中尝试了嵌套的表和表,但似乎不允许这样(我得到一个“详细信息成员只能包含静态内部成员”错误。)

我读到了关于子报告的内容,我认为这可能是要走的路,但我不确定在这种情况下如何使用子报告,或者这实际上是正确的方法。

注意:如上所述,每个QuotationItem目前有3个数量,但将来可能会更改,因此如果列可以是动态的,那么会很好,但是,这不是必需的点。

有什么建议吗?

1 个答案:

答案 0 :(得分:6)

嗯,我希望(现在仍然)能够获得一个更优雅的解决方案而不是这个丑陋的(我现在必须使用它),但它确实做到了它的假设无论如何。

我发布它可能有助于遇到类似问题的人。这就是我的所作所为:

准备数据:

  • 使用VS设计器创建了一个虚拟DataSet,并向其添加了一个DataTable。
  • 将两个表中的所有必需列添加到此DataTable中。
  • 添加了DataSet作为报告的数据源。
  • 为了传递实际数据,我将使用与设计的相同的结构填充DataTable ,然后使用以下内容将其传递给报告:

    private void Form_Load(object sender, EventArgs e)
    {
        rptViewerMain.LocalReport.ReportEmbeddedResource = "MyProjectName.QuotationReport.rdlc";
        rptViewerMain.LocalReport.EnableExternalImages = true;
    
        if (QuotationInfo !=null && QuotationItems != null)
        {
            SetupReport();
        }
    
        this.rptViewerMain.RefreshReport();
    }
    
    private void SetupReport()
    {
        var param1 = new ReportParameter("MyFirstParameter", SomeValue);
        var param2 = new ReportParameter("MySecondParameter", SomeOtherValue);
        // etc
    
        // Pass Parameters
        rptViewerMain.LocalReport.SetParameters(new[] { param1, param2, "etc" });
    
        // Prepare the DataTable and add the values to it
        DataTable dt = new MyDummyDataset.MyDesignedDataTable().Clone();
    
        foreach (var qItem in QuotationItems)
        {
            dt.Rows.Add(qItem.ItemNumber, qItem.ItemDescription, "and",
                        "so", "many", "more", "values");
        }
    
        // Pass the DataTable to the report as the data source replacing the dummy DataSet
        rptViewerMain.LocalReport.DataSources.Add(new ReportDataSource("MyDummyDataset", dt));
    }
    

设计报告:

  • 在RDLC报告中仅创建了一个表(Tablix),并使用单元格边框使其看起来像3个表,方法是删除&#34;表之间不需要的单元格的边界&#34; enter image description here
  • 将虚拟数据集中的字段添加到第一个表中的相应单元格(数量信息)和表格上方(引用项目信息)。
  • 对于第二个和第三个&#34;表&#34;,只需使用表达式根据第一个表中的值进行计算。

注意:一些字段/变量名称在问题和答案中都有所改变,但这个想法保持不变。