2009-02-20 4 views
1

J'utilise des rapports rdlc pour signaler certains objets métier. J'utilise des sous-rapports pour signaler des objets imbriqués (comme décrit here). Lorsque vous utilisez une liste régulière d'objets enfants, comme IList (Of Books), je crée une source de données pour les livres, puis je l'utilise comme source de données du sous-rapport.Rdlc: signaler un objet enfant qui est un IList d'un type primitif

Je suis un peu coincé sur la façon d'utiliser cette technique lorsque l'objet imbriqué est un IList (Of String), ou une autre liste d'un type primitif.

Quelle est la meilleure façon de générer des rapports dans ce scénario?

Répondre

0

J'ai rencontré un problème similaire. J'ai eu un rapport en cours d'exécution d'une liste de CustomObject. La liste CustomObject a été remplie à partir d'une requête sur une liste de ParentObjects contenant de nombreuses références à tous leurs objets personnalisés. La relation a été supprimée et une colonne de chaîne a été utilisée sur le ParentObject (ParentObject.CustomObjectName) à la place. Maintenant, mon rapport reçoit une chaîne [] contenant tous les noms CustomObject.

Ma solution créait un objet wrapper avec une seule propriété de chaîne et un constructeur à utiliser comme source de données. Je l'ai nommé comme le CustomObject attendu par mon rapport.

class CustomObject 
{ 
    public string Name {get; set;} 

    public CustomObject(string name) 
    { 
     Name = name; 
    } 
} 

je charge ma liste à l'aide LINQ, je l'appelle le constructeur d'emballage dans l'instruction select

var wrappedObjects = from parent in GetParentObjects() 
    select new CustomObject(parent.CustomObjectName); 

D'après le rapport, vous pouvez ajouter une source de données pour la classe CustomObject comme vous le feriez normalement et accéder à la objet comme d'habitude "= Fields! Name.Value".

0

J'ai une structure d'objet comme si

commande -> Liste: OrderItems (produits) -> Liste: AdditionalProducts (Produits)

J'ai un rapport principal avec un sous-état et un subsubreport.

Je fixe ce de la manière suivante

Dans le sous-état, je passe un paramètre au rapport de sous-sous. ce paramètre a une valeur du nom du produit et s'appelle "thisproduct".

La fonction de sous-rapport de traitement est appelée à la fois par le sous-rapport et le sous-rapport. J'ai donc besoin d'assigner la source de données pour les deux ici.

  1. J'assignez la source de données pour le sous-état (order.items)

  2. ajouter un "si" car si le subsubreport (InternalOrderItemAdditionalProducts) appelle cette fonction. ici je vérifie le paramètre, et obtiens le nom du produit. Je peux ensuite passer en revue les points de commande, trouver celui qui concerne le produit examiné, puis affecter la source de données subsubreport à d'autres produits liés à ce produit.

    private void SubreportProcessing(object sender, SubreportProcessingEventArgs e) 
        {  
        // assign subreport datasource 
        e.DataSources.Add(new ReportDataSource("OrderItems", order.Items)); 
    
        // if the subsubreport is calling this then 
        if (e.ReportPath != null) 
         if (e.ReportPath == "InternalOrderItemAdditionalProducts") 
         { 
          // find the orderitem relating to this product 
          foreach (var orderitem in order.Items) 
          { 
           if (e.Parameters["thisproduct"].Values[0] == orderitem.ProductType.Name) 
           { 
            // assign the subsubreport datasource to be the additional products of that order item 
            e.DataSources.Add(new ReportDataSource("AdditionalProducts", 
                     orderitem.Product.AllDescendentAdditionalProducts)); 
           } 
          } 
         } 
    

    }

Questions connexes