Votre question

[C#] Problème avec foreach

Tags :
  • Midi
  • Programmation
Dernière réponse : dans Programmation
3 Juillet 2011 23:28:43

Bonsoir,
J'ai un gros problème depuis cet après midi, ca me casse vraiment vraiment la tête :o 

Voici déjà le code :

  1. public static void maj_lv(string item_id, string subx, string suby)
  2. {
  3. bool found = false;
  4. ListViewItem item = new ListViewItem();
  5. ListView.ListViewItemCollection item_coll = frm.listView1.Items;
  6. frm.listView1.Invoke((MethodInvoker)(() => item_coll = frm.listView1.Items));
  7.  
  8. foreach (ListViewItem LVI1 in item_coll)
  9. {
  10. if (LVI1.Text == item_id)
  11. {
  12. found = true;
  13. item = LVI1;
  14. }
  15. }
  16.  
  17. if (found)
  18. {
  19. item.SubItems[1].Text = "Already";
  20. item.SubItems[2].Text = "Already";
  21. }
  22. else
  23. {
  24. ListViewItem LVI;
  25. ListViewItem.ListViewSubItem LVSI;
  26.  
  27. LVI = new ListViewItem();
  28. LVI.Text = item_id;
  29.  
  30. LVSI = new ListViewItem.ListViewSubItem();
  31. LVSI.Text = subx;
  32. LVI.SubItems.Add(LVSI);
  33.  
  34. LVSI = new ListViewItem.ListViewSubItem();
  35. LVSI.Text = suby;
  36. LVI.SubItems.Add(LVSI);
  37.  
  38. frm.listView1.Invoke((MethodInvoker)(() => frm.listView1.Items.Add(LVI)));
  39. }
  40. }


Donc normalement quand je rentre données item_id, subx et suby, une nouvelle ligne doit se créer dans ma listview.
Si je le fais à l'aide d'un bouton et d'une textbox, ca marche nickel =)
Mais le problème apparait quand je suis dans une fonction statique et que j'appelle cette fonction : une première ligne sur ma listview apparait puis c'est tout, il n'y en a qu'une --'.
J'ai donc testé avec des MessageBox pour voir d'où venait le problème et j'ai vu que c'est au niveau du foreach, du moins je crois.
Lors de la première utilisation de la fonction, tout marche nickel, mais la deuxième fois, on dirais que tout ce qui est derrière le foreach n'est pas effectué ...

Je vous remercie d'avance de votre aide ^^
Bonne soirée bye

Autres pages sur : probleme foreach

a c 232 L Programmation
4 Juillet 2011 09:21:55

Salut,

Pourquoi tu fais des Invoke ?

Et ça doit être à cause de la fonction statique, il faut certainement que tu repasses la référence à ta Form ou ta ListView
m
0
l
5 Juillet 2011 11:10:55

Bonjour,
Excusez moi du temps de réponse je n'étais pas chez moi ^^

Alors je suis obligé de faire des Invoke car sinon il n'y a aucun Item qui s'ajoute, même pas le premier.
Qu'est-ce que tu veux dire par repasser la référence ? Il faut que je le fasse à l'intérieur de la fonction statique ou bien quand je déclare la fonction?

Merci encore ;) 
m
0
l
Contenus similaires
5 Juillet 2011 11:42:50

Tu te fais chier pour ajouter les items hein...

For (int i =0; i < item_coll.count - 1; i++)

mon_listview.item.add("mavaleur")
mon_listview.item(i).subitem.add(mavaleurdesubitem)
mon_listview.item(i).subitem.add(mavaleurdesubitemdesubitem)

Next

Et boum !
m
0
l
5 Juillet 2011 12:39:09

Oui je m'embête je sais mais je ne veux pas qu'un item y soit 2 fois, c'est bien pour cela que je suis obligé de passer par foreach pour vérifier tous les items et voir s'ils ne sont pas déjà présents :s
m
0
l
a c 232 L Programmation
5 Juillet 2011 13:11:46

et si tu ne fais pas ça dans une fonction statique?
Est-ce que tu utilises plusieurs Threads ?
m
0
l
5 Juillet 2011 13:27:19

Le problème est que mon script sert "un peu de proxy". C'est à dire qu'il reçoit et réenvoie les données comme un proxy quoi ^^
Et donc grâce aux données que je reçois, je voudrais les trier et les ranger dans une listView sans qu'il y est 2 fois le même item.
Donc il y a un thread qui tourne en permanence (--> fonction statique) et lorsqu'il repère les données à trier, il appelle la fonction ci dessus pour les classer dans la listView.

Donc j'ai l'impression que le problème vient des fonctions statiques ...

EDIT : j'utilise 2 threads en permanence et juste quelques autres mais très occasionnellement.
m
0
l
5 Juillet 2011 14:48:18

Re
Excusez moi pour le double post mais je préfère faire un message à part pour donner la réponse :s

Il y avait un problème au niveau du invoke dans les if donc j'ai remplacé le foreach :

  1. foreach (ListViewItem LVI1 in item_coll)
  2. {
  3. if (LVI1.Text == item_id)
  4. {
  5. found = true;
  6. item = LVI1;
  7. }
  8. }


par un for :

  1. string LVText = "";
  2.  
  3. for (int i = 0; i < frm.listView1.Items.Count; i++)
  4. {
  5. frm.listView1.Invoke((MethodInvoker)(() => LVText = frm.listView1.Items[i].Text));
  6. if (LVText == item_id)
  7. {
  8. found = true;
  9. frm.listView1.Invoke((MethodInvoker)(() => item = frm.listView1.Items[i]));
  10. }
  11. }


Merci encore à OmaR et SliverPopop pour votre aide.
Bonne aprèm !
m
0
l
a c 232 L Programmation
5 Juillet 2011 14:49:56

Si c'est fait dans un autre Thread, c'est normal qu'il faut que tu passes par des Invoke, vu que c'est pas ton thread de l'UI qui va exécuter ça.
J'avoue avoir un peu de mal à comprendre ton architecture là.

Une classe statique ne devrait pas mettre à jour ton UI. Elle peut te retourner une collection d'items, que tu ajoutes dans ton UI ailleurs, mais ton architecture me semble bancal là.
m
0
l
5 Juillet 2011 15:41:57

Je suis obligé de passer par des classe statique pour mettre à jour ma listView :s donc j'ai pas trop le choix
m
0
l
a c 232 L Programmation
5 Juillet 2011 16:53:34

Obligé, non :) 
Mais ton architecture a l'air d'être comme ça...
m
0
l
6 Juillet 2011 00:32:20

Oui je ne suis pas obligé car je peux forcément changer, tu as raison ^^
En tout cas ça marche, et au moins maintenant je peux me casser la tête sur d'autres problèmes.
Je te remercie encore, bonne soirée
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS