2010-06-25 11 views
3

J'ai une structure de classe existante en place et je souhaite/je dois l'utiliser comme source de données pour une série de rapports utilisant vb et 2005 (bien que nous soyons presque prêts à passer à 2010 , donc si cela résoudra ce problème aujourd'hui!)Afficheur de rapport - Objet avec objets de liste imbriqués

En utilisant gotreportviewer sample pour les objets imbriqués ive a ajouté une classe reportmanager exposant une méthode getdata qui a peuplé toutes mes données et retourné une liste (d'objet). Les données sont là et correctes au moment de la liaison de données, je peux ajouter et référencer les propriétés de niveau supérieur, peu importe la syntaxe que j'essaie de faire référence aux champs dans les classes/listes imbriquées. Je reçois divers messages allant de "#Error" dans le champ de sortie à rien, à ne pas compiler.

ma structure de classe est à peu près cette forme courte:

Assembly0 
    Class ReportManager 
    TheData as List(Of Object) 
    New() 'that populates TheData from the class structure below 
    GetData() as List(of Object)  

    Assembly1 
    Class Test 
    aProperty1 as String 
    aProperty2 as Int 
    aProperty3 as String 
    aProperty4 as String 
    aProperty4 as List(of aType1) 

    Assembly2 
    Class AaType1 
    aProperty1 as String 
    aProperty2 as Int 
    aProperty3 as String 
    aProperty4 as String 
    aProperty4 as List(of aType2) 
    aProperty4 as List(of aType3) 
    aProperty4 as String 

    Assembly3 
    Class aType2 
    aProperty1 as Boolean 
    aProperty1 as String 
    you get the idea 

    and so on..... 

dans mon application principale

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
' Create an instance of our ReportManager Class 
Try 
    ' trust assemblies used in get data 
    ReportViewer1.LocalReport.ExecuteReportInCurrentAppDomain(Assembly.GetExecutingAssembly().Evidence) 
    ReportViewer1.LocalReport.AddTrustedCodeModuleInCurrentAppDomain("assy1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1234") 
    ReportViewer1.LocalReport.AddTrustedCodeModuleInCurrentAppDomain("assy2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1234") 
    ' etc through ALL dependant assemblies 

    ' create datamanager, that will populate its TheData property 
    Dim reportMan As Data.Reporting.Manager = New Data.Reporting.Manager(18) ' test id sent 

    ' this is the method from the gotreportviewer sample, which only allows you to reference top level properties, regardless of syntax used. i.e. =Fields!Prop.Value.SubProp 
    ' doesnt work 
    'ReportViewer1.LocalReport.DataSources.Add(New ReportDataSource("DummyDataSource", reportMan.GetData)) 
    'Me.ReportingDataBindingSource.DataSource = reportMan.GetData 


    ' this is the only method i have found that allows me to reference an objects nested property and its fields.....? 
    Data = reportMan.GetData() 
    Me.ReportViewer1.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Local 
    Me.ReportViewer1.LocalReport.DataSources.Add(New ReportDataSource("Data_Reporting_ReportingData", Data)) 

    ' fortnatley there is only ever one test in the list, HOWEVER there will be 4 specimens and n stages below that and so on.. 
    Dim SpecimenData As SpecimenList = Data(0).Specimens 
    Me.ReportViewer1.LocalReport.DataSources.Add(New ReportDataSource("Tests_Specimen", SpecimenData)) 

    ' so this method is no good either. currently only a test its just returning the first specimen. 
    'Dim StageData As Tests.Stages = Data(0).Specimens(0).Stages 
    'Me.ReportViewer1.LocalReport.DataSources.Add(New ReportDataSource("Tests_Specimen", SpecimenData)) 

    ' render report 
    Me.ReportViewer1.RefreshReport() 
Catch ex As Exception 
    MessageBox.Show(ex.Message) 
End Try 

End Sub

Corrections je l'ai trouvé en ligne/googler:

  • Vous doit ajouter "ExecuteReportInCurrentAppDomain", fait que pas de différence. Vous devez ajouter Assembly: AllowPartiallyTrustedCallers() à AssemblyInfo.vb, aucune différence.

  • Vous devez fortement nommer des ensembles dépendants, fait cela et il ne se débarrasser de une erreur concernant un appel étant fait dans la propriété « Code » du rapport (pour la localisation).

  • avez essayé la syntaxe = Fields! Property.Value.SubProperty et cela ne fonctionne pas! peu importe quelle variation j'essaie.

    « dans la rdlc - cette syntaxe fonctionne pour les propriétés de haut niveau
    = Somme (! Les champs TestVersion.Value, « Data_Reporting_ReportingData »)

    » en utilisant la liste des méthodes de remplacement dans le code ci-dessus cela fonctionne
    = First (Fields! Index.Value, "Tests_Specimen")

    ', mais ceux-ci DonT pour ses propriétés enfant
    = First (Fields! Specimens.Value.Index, "Data_Reporting_ReportingData")
    = Fields! Specimens.Value .Index
    = Les champs! Specimens.Value.Index.Value

    Cela signifie-t im goin se est d'autre choix que de créer quelque chose comme Dim SpecimenData Comme Tests.SpecimenList = données (0) .Specimens pour chaque objet imbriqué? Aussi pour des raisons évidentes, je n'ai pas besoin d'aplatir toute la structure de données comme massive.

J'ai essayé tout ce que je peux trouver sur ce point, pas grand-chose là-bas et les points de tout retour aux trois mêmes quatre articles/posts de blog qui vient travailler ne coûtent pas pour moi, thier échantillons travail non modifié, mais aucun d'entre eux fonctionne lorsqu'il est appliqué à des listes imbriquées ou à des objets imbriqués de types de liste hérités.

Quelqu'un a-t-il un exemple de code d'utilisation d'objets avec des listes imbriquées qui fonctionne réellement? comme aucun de ceux que je pourrais trouver en ligne travailler avec n'importe quoi mais le plus simple des scénarios. c'est-à-dire un assemblage, ou un fichier de code ou pas de listes imbriquées ou de types simples/natifs.

J'y suis allé la meilleure partie d'une semaine! Im maintenant chauve et souligné s'il vous plaît aider.

A défaut, est-ce que quelqu'un peut suggérer un fournisseur tiers qui supporte ce genre de chose? fait du cristal? caillou?

appologies pour le mur du texte ... matma

Répondre

2

Je cherche presque le même, sauf que j'ai des objets qui ont comme propriété d'autres objets, aucune liste d'objets, de quelque façon, vous demandé si Crystal Reports faire ce genre de chose, OUI, il est, c'est un peu difficile de le faire, mais il le fait.

Je ne sais pas pourquoi c'est si difficile de travailler avec ce genre de réflexion de nos jours. Parce que nous travaillons toujours avec Frameworks de persistance, comme Entity Framework, et d'autres, vous faites un boulot avec une persistance, et quand vous allez aux rapports, vous devez retourner à votre modèle DataBase si vous voulez travailler facilement! Donc perdre du temps! Je viens de trouver, il est possible de le faire dans le visualiseur de rapport, Mais il a eu un problème dans Visual Studio 2010, il est fixé dans SP1 mais vous devez définir toutes vos classes qui sont utilisées comme objets imbriqués comme Serializable

S'il vous plaît lire: http://wraithnath.blogspot.com.br/2011/04/reportviewer-object-datasource-nested.html

+0

oui cela semble être la réponse, mais je ne envie d'aller à travers les cerceaux pour mettre en œuvre la solution que l'im objet à partir est une chose de l'héritage et doivent avoir 200 objets dans toute son heirachie – Matma