【问题标题】:VB.Net: How to use an Object data source in report (.rdlc)VB.Net:如何在报表中使用对象数据源 (.rdlc)
【发布时间】:2011-04-12 15:55:45
【问题描述】:

我的问题类似于this one,但我在实际实现中遇到了一些问题。

我在 3 层应用的业务层中有一个报告 (.rdlc)。

我在 BL (EmployeeManager) 中有一个对象,它有一个 GetEmployees(Expression as Expression(Of Func(Of Employee, Boolean))) As IQueryable(Of Employee) 方法。

由于我不想尝试直接传递 lambda(至少在我有工作之前不会),我在 BL 中创建了一个 ReportData 类,它包装了 GetEmployees() 调用和将结果公开为 IEnumerable(Of Employee) - 这应该非常简单。目前它甚至没有参数。

好的...所以在我的报告中,我尝试添加一个新的数据源。我选择了一种Object 并找到了上面提到的ReportData 类。向导完成并将 DataSources 文件夹添加到项目中,其中包含一些定义 <GenericObjectDataSource> 并指向 Report 类的 XML。

ReportData 也出现在“数据源”窗格中 - 它旁边有一个 >,但是当我展开它时,它没有子级。

我不知道该怎么做是使用数据源 - 它似乎没有公开任何方法/成员(我什至还没有指定它应该调用GetEmployees()!)我当然可以在任何地方都看不到IEnumerable(Of Employee)

当我尝试向报表添加表格并提示我选择数据集时,ReportData 数据源未显示在数据源下拉列表中。

我错过了什么?有人可以指出我正确的方向吗?

我的简单 ReportData 对象:

Namespace Reports
    Public Class ReportData

        Private Property EmployeeManager As Interfaces.IEmployeeManager

        Public Sub New()
            ''This sub is here in case it's an instantiation problem - I intend to use dependency injection when I've got this working properly.
            Me.EmployeeManager = New EmployeeManager
        End Sub

        Public Sub New(ByVal EmployeeManager As Interfaces.IEmployeeManager)
            Me.EmployeeManager = EmployeeManager
        End Sub

        Public Function GetEmployees() As IEnumerable(Of Employee)
            Return EmployeeManager.GetEmployees()
        End Function
    End Class
End Namespace

我还发现了this,这似乎表明我正在遵循正确的步骤,但属性没有按预期显示

类的公共属性现在显示在“数据源”窗口中,可以将它们拖放到报表中。

这不会发生 - 属性永远不会出现

EDIT:正如 Alex 所指出的,我需要使用 properties 而不仅仅是任何方法。请参阅下面 Alex Esselfie 的回答以进行澄清。这仍然没有解决我的问题,但让我更近了一步......

【问题讨论】:

    标签: .net reporting-services reporting rdlc objectdatasource


    【解决方案1】:

    根据您的描述和随附的代码,ReportData 类中没有属性。如果我认为正确的话,该类应该会生成您想要在报告上显示的IEnumerable

    如果是这种情况,您必须在向导中选择 Employee 类作为数据源。这将允许您在报告中显示数据。

    我将处理一个快速项目并稍后将其添加到此答案中。



    编辑 1

    如何将类绑定到报表

    Visual Studio 2008

    1. 设计视图中打开报表。
    2. 从菜单栏中选择Data > Show Data Sources
    3. 点击“数据源”窗口中的添加新数据源
    4. 选择对象并点击下一步
    5. 浏览解决方案树并选择要绑定到的类。
      在您的情况下,您绑定到 Employee 类。
    6. 单击下一步,然后单击完成


    Visual Studio 2010

    1. 设计视图中打开报表。
    2. 从菜单栏中选择View > Report Data
    3. 在“数据源”窗口中单击New > Dataset...
    4. 输入数据集的名称(例如员工)
    5. 创建新数据源或选择现有数据源。

      创建新数据源

      • 选择对象并点击下一步
      • 浏览解决方案树并选择要绑定到的类。
      • 点击完成


    将类绑定到报表后,继续照常设计报表。


    编辑 2

    我为您上传了一个示例项目。这是link
    如果您需要进一步澄清,请通知我,以便我为您提供有关如何复制项目的分步过程。

    【讨论】:

    • 谢谢 - 你的意思是它实际上必须是一个属性而不是一个函数?我会很感激这个示例项目,但我也会对其进行测试......
    • 好的,将其更改为属性让我更进一步 - 我现在可以在数据源窗格的数据源上看到一个子元素 (GetEmployees()) - 但是当我添加时它仍然没有列出一个表格,它要求我提供一个数据集 - 我需要做些什么才能将数据源用作数据集吗?
    • 这是一个绑定报表的类。当一个类被绑定到一个报表时,它的属性就变成了可以在那个报表上显示的字段。因此,您必须将报告绑定到返回值(在本例中为Employee)。
    • 我刚刚完成了示例项目。您是要我上传整个项目还是应该只编辑答案以显示项目的内容。
    • 嗨,Alex,您能说明一下我将如何绑定报告吗?我在属性窗格中看不到任何似乎适用的内容...
    【解决方案2】:

    我遇到了同样的问题。我必须向我的表示层添加一个数据源(对象类型),它指向我在业务层中的对象(带有属性类的集合)。我在表示层创建了报告(.rdlc)并将其指向数据源,一切正常。这是我发现向报告公开字段属性的唯一方法。在运行时,我将报表数据源绑定到集合。我喜欢在业务层设计一个“平面”集合,处理数据并将其发送到 rdlc,使报告尽可能“笨”。

    【讨论】:

    • 我完全同意——我很想将一些复杂的东西卸载到报告中(这是合乎逻辑的),但似乎尝试除了愚蠢的数据集之外的任何东西都是一种方法灾难 - 绝对是 MS 堆栈中需要大修的一个区域。当我要求报告引擎进行分组/排序而不是简单的 Linq 查询时,您应该会看到开销......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多