2009-01-23 7 views
2

Je tente d'obtenir des objets imbriqués pour travailler dans des rapports Microsoft. J'ai téléchargé le code d'exemple de http://www.gotreportviewer.com/objectdatasources/index.html, et il fonctionne correctement.Microsoft signale que l'objet imbriqué datasource donne #Error

J'ai construit la petite application suivante basée sur un Windows Form et leur code, et tout ce que je reçois quand je référence une valeur d'objet imbriqué est un "#Error" à l'endroit où les données devraient apparaître.

Dans le rapport, j'utilise la même syntaxe d'objet imbriqué qui est recommandé sur le site Web:

=Fields!Name.Value.FirstName 

Il travaille pour leur application sur mon ordinateur, mais pas pour moi. Je ne peux pas le comprendre! Est-ce que quelqu'un a rencontré ceci, ou sait pourquoi cela se produit?

En outre - et je ne sais pas si cela est lié - je ne peux pas ajouter une seule instance de ClientItem à l'objet LocalReport.DataSources. Ça doit être une liste. Cependant, quand il rend, il montre seulement une ligne de données (#Errored) dans la table sur le rapport.

Toute aide serait appréciée!

namespace ReportTest 
{ 

    public class ClientItem 
    { 
     public int Id { get; set; } 
     public ClientName Name { get; set; } 
    } 

    public class ClientName 
    { 
     public ClientName(string first, string last) 
     { 
      FirstName = first; 
      LastName = last; 
     } 

     string FirstName { get; set; } 
     string LastName { get; set; } 
    } 

    public partial class Form1 : Form 
    { 
     private List<ClientItem> clients = new List<ClientItem>(); 

     public Form1() 
     { 
      InitializeComponent(); 
      PopulateLists(); 
      GenerateReport(); 
     } 

     private void PopulateLists() 
     { 
      clients.Add(new ClientItem { Id = 1, Name = new ClientName("Adrian", "Adesco") }); 
      clients.Add(new ClientItem { Id = 2, Name = new ClientName("Brian", "Briar") }); 
      clients.Add(new ClientItem { Id = 3, Name = new ClientName("Clive", "Cussler") }); 
     } 

     private void GenerateReport() 
     { 
      this.Text = "Report Control Demo"; 
      this.ClientSize = new System.Drawing.Size(950, 600); 

      ReportViewer reportViewer = new ReportViewer(); 

      reportViewer.ProcessingMode = ProcessingMode.Local; 

      reportViewer.LocalReport.ReportPath = "TestReport.rdlc"; 

      reportViewer.LocalReport.DataSources.Add(new ReportDataSource("ReportTest_ClientItem", clients)); 

      reportViewer.Dock = DockStyle.Fill; 
      this.Controls.Add(reportViewer); 

      reportViewer.RefreshReport(); 
     } 
    } 
} 

Répondre

1

D'accord, la solution pour le problème avec le cas de test (ci-dessus) est de rendre les propriétés en public ClientName:

public class ClientName 
{ 
    public ClientName(string first, string last) 
    { 
     FirstName = first; 
     LastName = last; 
    } 

    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

Ce résolu le problème de test pour moi.

Cependant, j'avais toujours des problèmes avec mon rapport réel. C'était toujours donner une erreur. Il s'est avéré que c'était parce que le sous-objet était défini dans un assemblage différent.

Pour que cela fonctionne, la ligne suivante devait être ajouté au fichier AssemblyInfo.cs du projet contenant le sous-objet:

[assembly: AllowPartiallyTrustedCallers] 

Maintenant, ça marche! J'ai eu un peu de temps pour le découvrir - j'espère que cela aidera quelqu'un ...

+0

J'ai un problème très similaire à vous mais l'ajout de 'AllowPartiallyTrustedCallers' n'a pas fonctionné pour moi. Avez-vous d'autres suggestions à ce problème? – meanbunny