我有一个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,则它会正确显示名称。
我在这里做错了什么?
感谢!!!
答案 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)
我不确定如何解决您的问题,但我有几点建议......
也许您将IIF声明更改为:
IIf(IsNothing(Fields!TheNestedObject,"n/a", Fields!TheNestedObject.Value.Name))
IIf
总是评估所有参数,因此它正在尝试评估TheNestedObject
。值。如果TheNestedObject
为NULL
或NOTHING
,那么我发现错误就不会感到惊讶。
另一个想法是修改构造函数,以便在没有“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)
、AllowNullDestinationValues
、AllowNullCollections
、PreserveReferences()
和 NullSubstitute
功能的组合来映射我的所有域类以报告特定类并将所有空引用替换为空对象(将域对象空引用映射到报告对象时)或合理的默认值(例如,空字符串的空字符串或 ForAllPropertyMaps()
的基础原始类型的默认值)。< /p>
以下是一些示例代码来演示该方法:
Nullable<PrimitiveType>