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

Le
Gloops
Bonjour tout le monde,

Jrmy voquait il y a quelques semaines la possibilit de baser =
un
Report sur un objet List<> plutt qu'un DataSet, voil que a
m'intresse puisque j'ai lu une bote mail en la copiant vers un
ListView, et que par la mme occasion j'en ai profit pour enregistre=
r
les donnes aussi dans une List<>. A la fin, j'aimerais bien passer
cette List<> dans un ReportViewer, de faon pouvoir imprimer la lis=
te
des mails (plutt 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 chane de caractres, destins recevoir les =

intituls de l'expditeur, du destinataire, de la date, du sujet du
mail, et d'un numro.

Je n'ai pu, dans l'interface de cration du Report, affecter la
proprit DataSetName qu' un DataSet existant, aussi j'ai cr=
un
DataSet1 avec une DataTable comportant des colonnes avec les mmes noms=

que les champs de MessageListCR.

Au demeurant on peut affecter la proprit par code l'excution=
, mais
a devient plus coton pour affecter la mme valeur au DataSetName du =

contrle 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 rsultat, a donne, sur l'instruction obj[i] = listMLCR[i]=
,
l'erreur suivante :

System.ArgumentException was unhandled
Message="Le tableau en entre 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 prcis 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 diffrent, surtout tant =
que
le Report n'est pas encore en cause.

Aprs, j'avoue que je sche 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