如何处理绑定到自定义程序集对象数据源的RDLC报表中的空嵌套对象?

时间:2009-08-27 19:21:35

标签: .net asp.net vb.net reporting-services rdlc

我有一个RDLC报告,我直接以PDF格式呈现响应流(而不是使用ReportViewer)。在呈现报表的代码中,它的DataSource绑定到自定义程序集中定义的List(Of ClassA)对象。这似乎在很大程度上起作用。我的问题是我似乎无法处理嵌套对象为null的情况。例如,给定ClassA和ClassB(嵌套对象)定义如下:

    Public Class ClassA
       Public Id As Integer
       Public Name As String
       Public TheNestedObject As ClassB
    End Class

    Public Class ClassB
       Public Id As Integer
       Public Name As String
       Public TheParentObject As ClassA
    End Class

每当我尝试有条件地显示“N / A”时,如果我的表达式中B类为空,如下所示:

=IIf(IsNothing(Fields!TheNestedObject.Value,"n/a", Fields!TheNestedObject.Value.Name))

如果TheNestedObject为null,则报告显示“#Error”。如果TheNestedObject不为null,则它会正确显示名称。

我在这里做错了什么?

感谢!!!

4 个答案:

答案 0 :(得分:1)

iif函数评估所有参数,因此对Fields!TheNestedObject.Value.Name进行评估,并给出错误,因为Fields!TheNestedObject.Value为null。

我最终在报告中添加了一些自定义代码。它在报告属性下 - >代码选项卡。

Public Function GetName(ByRef obj As Object) As String
    If obj Is Nothing Then
        Return "n/a"
    Else : Return obj.Name
    End If
End Function

然后您的文本框表达式为:

=Code.GetName(Fields!TheNestedObject.Value)

当函数为null时,函数返回“n / a”,而当函数不为时,返回Name属性。

答案 1 :(得分:0)

我不确定如何解决您的问题,但我有几点建议......

  1. 也许您将IIF声明更改为:

    IIf(IsNothing(Fields!TheNestedObject,"n/a", Fields!TheNestedObject.Value.Name))
    

    IIf总是评估所有参数,因此它正在尝试评估TheNestedObject。值。如果TheNestedObjectNULLNOTHING,那么我发现错误就不会感到惊讶。

  2. 另一个想法是修改构造函数,以便在没有“B”时添加“空”“B”对象。例如,A.TheNestedObject将指向没有数据的“B”对象。 B.Id将为0(默认情况下),除非您将其设为可为空的Int。 B.Name将是“”。等

答案 2 :(得分:0)

=iif(First(Fields!model.Value, "model") Is Nothing, "value is NULL", "value is not NULL")

答案 3 :(得分:0)

<块引用>

=IIf(IsNothing(Fields!TheNestedObject.Value,"n/a", Fields!TheNestedObject.Value.Name))

虽然您的表达式需要如下所示,但为了在语法上正确,在将其结果用作 IIf() 函数的参数之前,它仍会计算错误部分,因此仍会显示 {{1 }}:

#Error

我首先通过实现 Null object pattern 来解决 SSRS/RDLC 的这个缺点。 当涉及到一两个以上的领域对象时,手动实现这一点当然太费力了。

但是,由于我已经在使用 AutoMapper,@LucianBargaoanu 在评论中正确指出,AutoMapper 支持空对象作为选择加入功能,因此不需要显式实现。 因此,我使用 AutoMapper 及其 =IIf(IsNothing(Fields!TheNestedObject.Value),"n/a", Fields!TheNestedObject.Value.Name)AllowNullDestinationValuesAllowNullCollectionsPreserveReferences()NullSubstitute 功能的组合来映射我的所有域类以报告特定类并将所有空引用替换为空对象(将域对象空引用映射到报告对象时)或合理的默认值(例如,空字符串的空字符串或 ForAllPropertyMaps() 的基础原始类型的默认值)。< /p>

以下是一些示例代码来演示该方法:

Nullable<PrimitiveType>