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.ValueCela 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
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