Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

1 réponse
Avatar
Gloops
Bonjour tout le monde,

J=E9r=E9my =E9voquait il y a quelques semaines la possibilit=E9 de baser =
un=20
Report sur un objet List<> plut=F4t qu'un DataSet, voil=E0 que =E7a=20
m'int=E9resse puisque j'ai lu une bo=EEte mail en la copiant vers un=20
ListView, et que par la m=EAme occasion j'en ai profit=E9 pour enregistre=
r=20
les donn=E9es aussi dans une List<>. A la fin, j'aimerais bien passer=20
cette List<> dans un ReportViewer, de fa=E7on =E0 pouvoir imprimer la lis=
te=20
des mails (plut=F4t que de continuer =E0 l'obtenir par copie d'=E9cran de=
puis=20
la messagerie).

J'ai cr=E9=E9 une classe MessageListCR, et son instance listMLCR, comport=
ant=20
des champs de type cha=EEne de caract=E8res, destin=E9s =E0 recevoir les =

intitul=E9s de l'exp=E9diteur, du destinataire, de la date, du sujet du=20
mail, et d'un num=E9ro.

Je n'ai pu, dans l'interface de cr=E9ation du Report, affecter la=20
propri=E9t=E9 DataSetName qu'=E0 un DataSet existant, aussi j'ai cr=E9=E9=
un=20
DataSet1 avec une DataTable comportant des colonnes avec les m=EAmes noms=
=20
que les champs de MessageListCR.

Au demeurant on peut affecter la propri=E9t=E9 par code =E0 l'ex=E9cution=
, mais=20
=E7a devient plus coton pour affecter la m=EAme valeur au DataSetName du =

contr=F4le List dans le Report.

Comme code, =E7a donne =E7a :

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

reportViewer1.RefreshReport();
}
}

Et comme r=E9sultat, =E7a donne, sur l'instruction obj[i] =3D listMLCR[i]=
,=20
l'erreur suivante :

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

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

Apr=E8s, j'avoue que je s=E8che un peu.

1 réponse

Avatar
Gloops
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.