cs_wally88
Messages postés361Date d'inscriptionjeudi 5 février 2004StatutMembreDernière intervention 1 octobre 2010
-
15 nov. 2006 à 02:12
cs_wally88
Messages postés361Date d'inscriptionjeudi 5 février 2004StatutMembreDernière intervention 1 octobre 2010
-
16 nov. 2006 à 12:05
Bonjour, voila j'aimerais remplir un ArrayList par serialisation mais sa marche pas quel etape ai je louper? :
Je passe dans mon constructeur le string Intitule.
Donc en faite, j'ai un datagrid et tant qu'il y a des lignes, il doit ajouter le contenu de la ligne active dans le ArrayList :
while (i < dataGridView1.Rows.Count - 1)
{
ClsApercuImpression valeur = new ClsApercuImpression(dataGridView1.Rows[i].Cells["Intitule"].Value.ToString());
valeur.enregistrer();
i++;
}
Ma classe pour serialiser :
public void enregistrer()
{
ArrayList al = new ArrayList();
ClsApercuImpression p = new ClsApercuImpression(Intitule);
al.Add(p);
BinaryFormatter formatter = new BinaryFormatter();
FileStream fs = new FileStream("temp.txt", FileMode.OpenOrCreate, FileAccess.Write);
formatter.Serialize(fs, al);
fs.Close();
}
Donc sa fonctionne a peu pres car il me donne la derniere ligne de mon datagrid. En faite il ecrase mon ArrayList a chaque fois, A cause du new je suppose ? Mais comment faire pour ajouter le contenu de la cellule active au precedente?
Je sais pas si jsuis tres clair :/.
Merci .
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 15 nov. 2006 à 17:10
>Oui se sont des strings dans le tableau car se sont les données recuperer dans un datagrid.
Beh, tu as toi meme la réponse a ton probleme... Si ce sont des strings dans ton ArrayList, alors tu vas recuperer des strings a la sortie, pas des ClsApercuImpression.
Ou alors il faut que tu mettes des ClsApercuImpression dans ton ArrayList
Reprenons le principe :
Tu as la base un ArrayList. Dans cet ArrayList, tu as mis des strings.
Tu serialises cet ArrayList. Tu as donc, sur ton disque, la representation binaire de ton ArrayList (contenant tes strings) sous la forme d'un fichier.
Ensuite, tu prends ce meme fichier, et tu fais une opération de deserialisation. Tu vas donc retrouver ton ArrayList dans le meme état qu'il etait avant la serialisation, c'est a dire, avec tes strings a l'interieur.
cs_wally88
Messages postés361Date d'inscriptionjeudi 5 février 2004StatutMembreDernière intervention 1 octobre 2010 15 nov. 2006 à 22:10
Nikel ;o) merci beaucoup beaucoup beaucoup. Par contre c'est nulle qu'one ne puisse pas renvoyer ligne par ligne dans la methode mais bon pas grave 1000 fois merci.
Form1 contenant un datagrid : enregistrement de l'arraylist en le serialisant puis affichage de la Form2
int i=0;
ArrayList al = new ArrayList();
while (i < dataGridView1.Rows.Count - 1)
{
al.Add(dataGridView1.Rows[i].Cells["Intitule"].Value.ToString());
i++;
}
ClsApercuImpression enregistrer = new ClsApercuImpression();
enregistrer.enregistrer(al);
Form2 affiche = new Form2();
affiche.ShowDialog();
serialisation depuis la methode de la classe ClsApercuImpression :
public void enregistrer(ArrayList al)
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream fs = new FileStream("temp.txt", FileMode.OpenOrCreate, FileAccess.Write);
formatter.Serialize(fs, al);
fs.Close();
}
Form2 : affichage des données recuperer par la deserialisation dans un label :
private void FactureImpression_Load(object sender, EventArgs e)
{
ClsApercuImpression valeur = new ClsApercuImpression();
ArrayList al = valeur.lecture();
foreach (String a in al)
{
label1.Text =label1.Text+"\n"+ a.ToString();
}
}
deserialisation depuis la methode de la classe ClsApercuImpression :
public ArrayList lecture()
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream fs = new FileStream("temp.txt", FileMode.Open, FileAccess.Read);
ArrayList al = (ArrayList)formatter.Deserialize(fs);
fs.Close();
return al;
}
Voili je met tout on sais jamais sa peut aider.
Encore merci.
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 15 nov. 2006 à 08:50
Salut
Il te suffit d'instancier ton Arraylist une seule fois (au premier element), puis tu lui ajoutes tous les éléments, et finalement, tu le serializes aprés le dernier élément.
Mx
MVP C#
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_wally88
Messages postés361Date d'inscriptionjeudi 5 février 2004StatutMembreDernière intervention 1 octobre 2010 15 nov. 2006 à 14:46
Merci sa ma bien aider ;o) mon arrayList se rempli bien par contre j'ai un soucis de lecture car moi pas tout comprend (pour changer) si tu pouvais m'eclirer la dessus aussi :
Donc je veux lire mon arraylist et renvoyer chaque ligne de l arrayList, je dois pas etre trop loin mais c'est quoi l'identificateur dans le foreach ?
public void lecture()
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream fs = new FileStream("temp.txt", FileMode.Open, FileAccess.Read);
ArrayList al = (ArrayList)formatter.Deserialize(fs);
fs.Close();
cs_wally88
Messages postés361Date d'inscriptionjeudi 5 février 2004StatutMembreDernière intervention 1 octobre 2010 15 nov. 2006 à 14:59
Oui je suis d'accord la dessus mais quel objet ? Car dans mon livre il mette le nom de la classe en faite mais il me dis qu'il y a un probleme de conversion. Enfin sa fonctionnais avec ma methode enregistré dans mon premier message il me renvoyais bien si la derniere saisie etais "a" il m'affichais bien "a" hors la depuis que j ai changer ma methode de d'enregistrement cad que le tableau se rempli bien il me dis que je ne peu convertir un string en tableau ou inversement.
public void lecture()
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream fs = new FileStream("temp.txt", FileMode.Open, FileAccess.Read);
ArrayList al = (ArrayList)formatter.Deserialize(fs);
fs.Close();
foreach (ClsApercuImpression a in al)
{
p_intitule = a.Intitule;
}
}
Donc que faut il que je fasse ? peut etre renvoyer un tableau et le lire apres ?
Merci pour ton aide.
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 15 nov. 2006 à 15:15
Je vois pas bien ce que tu veux dire.
Si tu serializes bien un ArrayList, et si les objets contenus dans ton ArrayList sont bien des ClsApercuImpression, alors il ne devrait pas y avoir de souci.
A quelle ligne tu as ton erreur ? Quel est l'intitulé exact de l'exception ?
cs_wally88
Messages postés361Date d'inscriptionjeudi 5 février 2004StatutMembreDernière intervention 1 octobre 2010 15 nov. 2006 à 15:24
public void lecture()
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream fs = new FileStream("temp.txt", FileMode.Open, FileAccess.Read);
ArrayList al = (ArrayList)formatter.Deserialize(fs);
fs.Close();
int i=0;
foreach (ClsApercuImpression a in al)
{
p_intitule = a.Intitule;
i++;
}
}
foreach (ClsApercuImpression a in al) : Impossible d'effectuer un cast de type system.string en type krystl.clsApercuImpression.
cs_wally88
Messages postés361Date d'inscriptionjeudi 5 février 2004StatutMembreDernière intervention 1 octobre 2010 15 nov. 2006 à 15:48
Oui se sont des strings dans le tableau car se sont les données recuperer dans un datagrid.
Je serialise comme sa, en passant l'arraylist contenant les données recuperer de mon datagrid et cela fonctionne bien apparmement :
public void enregistrer(ArrayList al)
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream fs = new FileStream("temp.txt", FileMode.OpenOrCreate, FileAccess.Write);
formatter.Serialize(fs, al);
fs.Close();
}
et je deserialise comme sa et c'est la ou est le probleme :
public void lecture()
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream fs = new FileStream("temp.txt", FileMode.Open, FileAccess.Read);
ArrayList al = (ArrayList)formatter.Deserialize(fs);
fs.Close();
foreach (ClsApercuImpression a in al)
{
p_intitule = a.Intitule;
}
}
Y a t il un soucis dans la serialisation ? Pourquoi sa marche avec un string mais pas avec un arraylist de string ?
Merci.
cs_wally88
Messages postés361Date d'inscriptionjeudi 5 février 2004StatutMembreDernière intervention 1 octobre 2010 15 nov. 2006 à 21:37
Bon alors ca avance :D je veux retourner mes chaine de caractere :
public string lecture()
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream fs = new FileStream("temp.txt", FileMode.Open, FileAccess.Read);
ArrayList al = (ArrayList)formatter.Deserialize(fs);
fs.Close();
foreach (String a in al)
{
return a.ToString();
}
}
Le soucis etant que le return doit etre a l'exterieur du foreach car sinon il me dis que sa ne retourne pas forcement quelque chose.
Comment je fais pour qu il retourne chaque element ? Car il parcour bien le arraylist mais si jmet le return hors du foreach il prend comme valeur la derniere du tableau.
Merci
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 16 nov. 2006 à 09:01
De façon générale, en .Net 2 on utilise des collections générique (List<T>, Stack<T>, ...)
Dans ton cas, l'ArrayList stocke de Objects, la List<string> des strings. Dans ton foreach, chaque objet de ArrayList est donc casté en string. Ce qui n'a plus lieu avec une List<string>. Evidement, la tu ne vas pas voir grande différence, mais sur de larges collections, cela peut faire gagner un peu de temps. Et les collections génériques sont type safe.
Enfin c'etait juste une recommandation. En .Net 2 autant utiliser des collections génériques. Meme si dans ton cas présent ce n'est pas crucial, pour tes prochains devs, autant le faire, tu as tout a y gagner.