Paramétrage dynamique de la source d'image dans le rapport RDLC

j'utilise les fonctionnalités de reporting côté client qui sont intégrées à Visual Studio 2010. J'ai un fichier RDLC défini, actuellement avec des images intégrées à des fins de marque en haut du rapport. L'image est le logo de l'entreprise. Il n'a rien à voir avec les données du rapport... c'est juste un titre.

je voudrais être capable de briser la dépendance sur l'intégration des images, car je commence à avoir à mettre à l'échelle de l'application. Au lieu de cela, je voudrais être en mesure pour régler dynamiquement l'image. Malheureusement, il n'y a pas de type de paramètre qui semble supporter cela.

j'ai envisagé de changer la source de l'embedded vers l'extérieur, et peut-être d'émettre un fichier image du logo au lancement du programme (les logos sont intégrés en tant que ressources dans un assemblage séparé), puis de le désigner comme un fichier générique pour la source. Je ne suis pas sûr d'aimer cette option, car elle semble un piratage. J'obtiens aussi une erreur lors du test des images de chemin explicitement définies, effectivement dire que l'objet n'est pas réglé sur une instance. Par exemple, j'ai même essayé de la régler à D:test.jpg, et obtenu cette erreur au moment de la conception... donc je suis plus réticent à essayer cette option.

j'ai aussi cherché à appeler une classe dans une assemblée référencée à partir du fichier RDLC, mais je n'arrive pas à le faire fonctionner. On dirait que je peux faire référence à une assemblée, puis appeler via un objet spécial appelé Code. Parce que ma classe est statique, ça devrait être du Code.className.la méthode, mais que ne semble pas fonctionner.

j'ai aussi envisagé de transformer le titre en sous-rapport, mais je ne pense toujours pas avoir résolu mon problème de dépendance. Cela nécessiterait toujours le même montant de maintenance.

je dois mentionner que j'utilise des objets comme source de données. Quelle option dois-je aller? Ai-je raté quelque chose d'évident?

17
demandé sur Mike L 2011-03-28 09:16:56

2 réponses

Puisqu'il n'y a pas d'alternative (ou aucune!) avis sur la question, j'ai avancé plus loin et j'ai trouvé une solution de travail.

j'opte pour créer un fichier à la demande du logo, le stocker dans un emplacement temporaire. Si le fichier n'existe pas, je le crée à la volée. S'il existe, je fais juste référence à l'image qui existe.

dans le rapport RDLC, j'ai créé un paramètre appelé Path of type Text. Ensuite, dans les propriétés de l'Image, j'ai changer l'image du logo de l'embedded à l'externe et mettre "utiliser cette image" pour être le paramètre: [@Path].

puis, dans le code je passe dans le chemin du fichier comme paramètre de chemin. Mais là où je me suis déjà trompé, c'est que le chemin doit être une URL et que j'ai essayé de passer l'emplacement sur le disque. Donc, cette partie devrait ressembler à ceci:

        ReportParameter paramLogo = new ReportParameter();
        paramLogo.Name = "Path";
        paramLogo.Values.Add(@"file:///C:\Users\Mike\AppData\Local\Temp\Logo.png");
        reportViewer.LocalReport.SetParameters(paramLogo);

je dirais que la documentation MSDN pourrait être un peu meilleure. À leur crédit, il existe de nombreux détaillée documents sur la façon d'accomplir quelque chose à un niveau plus élevé. Ce article a aidé. Cela dit clairement que j'avais besoin d'une URL pour le chemin, mais il aurait été plus facile d'examiner cette propriété directement dans la bibliothèque. Toutefois, il a été plus difficile et moins fructueux de trouver la documentation de niveau inférieur. Voici le article pour L'Objet image de rapport. Il n'y a pas beaucoup l'occasion de définir des propriétés d'intérêt.

20
répondu Mike L 2011-04-19 21:10:39

j'avais le même problème, cependant la solution acceptée ne fonctionnait pas tout à fait pour moi. Il s'avère que j'avais besoin de mettre Enablexternalimages à true en plus de fournir le chemin au format URI et de définir mon Image.La valeur de =Parameters!ReportLogo.Value.

report.EnableExternalImages = true;
ReportParameter[]  parameters = new ReportParameter[3];
...
Uri pathAsUri =  new Uri(_info.LogoPath);
parameters[2] = new ReportParameter("ReportLogo", pathAsUri.AbsoluteUri);
report.SetParameters(parameters);
10
répondu jackal 2014-01-16 12:23:58