ReportViewer sur List : mais qu'est-ce qu'y dit ?

Le
Gloops
Bonjour tout le monde,

Jérémy évoquait il y a quelques semaines la possibilité de baser =
un
Report sur un objet List<> plutôt qu'un DataSet, voilà que ça
m'intéresse puisque j'ai lu une boîte mail en la copiant vers un
ListView, et que par la même occasion j'en ai profité pour enregistre=
r
les données aussi dans une List<>. A la fin, j'aimerais bien passer
cette List<> dans un ReportViewer, de façon à pouvoir imprimer la lis=
te
des mails (plutôt que de continuer à l'obtenir par copie d'écran de=
puis
la messagerie).

J'ai créé une classe MessageListCR, et son instance listMLCR, comport=
ant
des champs de type chaîne de caractères, destinés à recevoir les =

intitulés de l'expéditeur, du destinataire, de la date, du sujet du
mail, et d'un numéro.

Je n'ai pu, dans l'interface de création du Report, affecter la
propriété DataSetName qu'à un DataSet existant, aussi j'ai créé=
un
DataSet1 avec une DataTable comportant des colonnes avec les mêmes noms=

que les champs de MessageListCR.

Au demeurant on peut affecter la propriété par code à l'exécution=
, mais
ça devient plus coton pour affecter la même valeur au DataSetName du =

contrôle List dans le Report.

Comme code, ça donne ça :

private void Form1_Click(object sender, EventArgs e)
{
this.listView1.Visible = false;
this.reportViewer1.Visible = true;
DataSet1 ds = new DataSet1();
object[] obj = new object[listMLCR.Count];
for (int i = 0; i < listMLCR.Count - 1; i++)
{
obj[i] = listMLCR[i];
}
ds.Tables[0].LoadDataRow(obj, false);
ReportDataSource reportDataSource =
new ReportDataSource("listMLCR", ds);
reportViewer1.LocalReport.DataSources.Add(reportDataSource);=

reportViewer1.RefreshReport();
}
}

Et comme résultat, ça donne, sur l'instruction obj[i] = listMLCR[i]=
,
l'erreur suivante :

System.ArgumentException was unhandled
Message="Le tableau en entrée est plus long que le nombre de colon=
nes
de cette table."
Source="System.Data"

C'est quoi qu'y dit ? Je n'ai pourtant pas précisé de nombre de
colonnes, l'objet est un MessageListCR, donc je ne vois pas où se trouv=
e
la possibilité d'avoir un nombre de colonnes différent, surtout tant =
que
le Report n'est pas encore en cause.

Après, j'avoue que je sèche un peu.
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Gloops
Le #19956431
Bonjour,

Bon, alors je suis allé voir sur gotreportviewer.com, Generate RDLC
dynamically - Matrix.

Là-dedans le principe est plutôt d'affecter une List<> à chaque cha mp,
dans laquelle on a une valeur par enregistrement.

L'exemple passe par un Generator, puis par une sérialisation xml.

Histoire d'éviter la création d'un fichier en fin de lecture, j'ai cr éé
un DataSet, et j'enregistre les infos dedans pendant la phase de lecture
des mails.

Se garder de faire ds = new DataSet1(), sinon après on rame pour lier ce
DataSet au reportViewer.

ça marche mieux comme ça, après bien sûr création et paramétr age d'un
bindingSource sur le formulaire :

ds = (DataSet1) this.bindingSource1.DataSource;
dt = ds.Tables["DataTable1"];
// pour chaque mail :
dt.Rows.Add(Txt);
// fin pour
étant rappelé que les infos sont inscrites dans un tableau de chaîn es de
caractères Txt[].

ça marche.
_____________________________________
Gloops a écrit, le 18/08/2009 02:34 :
Bonjour tout le monde,

Jérémy évoquait il y a quelques semaines la possibilité de base r un
Report sur un objet List<> plutôt qu'un DataSet, voilà que ça
m'intéresse puisque j'ai lu une boîte mail en la copiant vers un
ListView, et que par la même occasion j'en ai profité pour enregist rer
les données aussi dans une List<>. A la fin, j'aimerais bien passer
cette List<> dans un ReportViewer, de façon à pouvoir imprimer la l iste
des mails (plutôt que de continuer à l'obtenir par copie d'écran depuis
la messagerie).

J'ai créé une classe MessageListCR, et son instance listMLCR, compo rtant
des champs de type chaîne de caractères, destinés à recevoir le s
intitulés de l'expéditeur, du destinataire, de la date, du sujet du
mail, et d'un numéro.

Je n'ai pu, dans l'interface de création du Report, affecter la
propriété DataSetName qu'à un DataSet existant, aussi j'ai créé un
DataSet1 avec une DataTable comportant des colonnes avec les mêmes no ms
que les champs de MessageListCR.

Au demeurant on peut affecter la propriété par code à l'exécuti on, mais
ça devient plus coton pour affecter la même valeur au DataSetName d u
contrôle List dans le Report.

Comme code, ça donne ça :

private void Form1_Click(object sender, EventArgs e)
{
this.listView1.Visible = false;
this.reportViewer1.Visible = true;
DataSet1 ds = new DataSet1();
object[] obj = new object[listMLCR.Count];
for (int i = 0; i < listMLCR.Count - 1; i++)
{
obj[i] = listMLCR[i];
}
ds.Tables[0].LoadDataRow(obj, false);
ReportDataSource reportDataSource =
new ReportDataSource("listMLCR", ds);
reportViewer1.LocalReport.DataSources.Add(reportDataSource) ;
reportViewer1.RefreshReport();
}
}

Et comme résultat, ça donne, sur l'instruction obj[i] = listMLCR[ i],
l'erreur suivante :

System.ArgumentException was unhandled
Message="Le tableau en entrée est plus long que le nombre de colo nnes
de cette table."
Source="System.Data"

C'est quoi qu'y dit ? Je n'ai pourtant pas précisé de nombre de
colonnes, l'objet est un MessageListCR, donc je ne vois pas où se tro uve
la possibilité d'avoir un nombre de colonnes différent, surtout tan t que
le Report n'est pas encore en cause.

Après, j'avoue que je sèche un peu.


Publicité
Poster une réponse
Anonyme