2009-08-27 5 views
1

J'ai un rapport RDLC que je rends directement au flux de réponses au format PDF (plutôt que d'utiliser le ReportViewer). Dans le code qui affiche le rapport, DataSource est lié à un objet List (Of ClassA) défini dans un assembly personnalisé. Cela semble fonctionner pour la plupart. Mon problème est que je n'arrive pas à gérer la situation où un objet imbriqué est nul. Par exemple, étant donné ClassA et ClassB (l'objet imbriqué) définies comme suit:Comment gérer les objets imbriqués nuls dans un rapport RDLC lié à une source de données d'objet d'assembly personnalisé?

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 

Chaque fois que j'essaie d'afficher conditionnellement un « N/A » si la classe B est nulle dans mon expression comme suit:

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

le rapport affiche "#Error" si TheNestedObject est null. Si TheNestedObject n'est pas null, il affiche correctement le nom.

Qu'est-ce que je fais mal ici?

Merci !!!

Répondre

1

La fonction évalue ssi tous les arguments et donc Fields! TheNestedObject.Value.Name obtient et donne l'évalué erreur car les champs! TheNestedObject.Value est nulle.

J'ai fini par ajouter du code personnalisé au rapport. C'est sous propriétés du rapport -> onglet Code.

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 

Et puis votre expression TextBox est:

=Code.GetName(Fields!TheNestedObject.Value) 

La fonction retourne "n/a" quand il est nul et la propriété Name quand ce n'est pas.

0

Je ne sais pas sûr de savoir comment résoudre votre problème, mais j'ai quelques suggestions ...

  1. Peut-être si vous avez changé votre déclaration de IIF être:

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

    IIf évalue toujours tous les arguments, donc il essaie d'évaluer TheNestedObject .Value. Si TheNestedObject est NULL ou NOTHING, alors je ne serais pas surpris de le voir jeter une erreur.

  2. Une autre idée serait de modifier votre constructeur pour ajouter un objet "B" "vide" chaque fois qu'il n'y a pas de "B". Par exemple, A.TheNestedObject pointerait vers un objet "B" qui n'a pas de données. B.Id serait 0 (par défaut) à moins que vous ne l'ayez rendu intensible. B.Name serait "". Etc.

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