Comment faire un Listbox qui contient des objets<T> contenus dans une List<T> ?
Bonjour,
J'ai un événement qui ajoute régulièrement un nouvel objet à une List<T>.
J'aimerai refléter le contenu de cette List<T> dans un contrôle liste.
Pour ça, j'ai essayé d'ajouter les éléments dans une Listbox mais je n'y arrive pas (problème d'"inter thread" quand j'utilise .Items.Add()).
Quelle est la bonne méthode ? Je débute en C#... Donc si vous pouvez être assez explicite ou me donner un tuto clair là dessus, ce geste sera bienvenu :-)
Bonne journée
J'ai finalement utilisé BeginInvoke()
Finalement, j'ai utilisé BeginInvoke() de mon ListBox comme me le conseillait g_tarik0010.
Ca me semblait moins lourd que faire un BackGroundWorker.
Etant donné que je stocke l'objet envoyé par l'événement dans mon ListBox, je ne devrai plus avoir de problème avec cet objet lorsque je le récupérerai de mon ListBox, je me trompe ?
Si c'est exact, cette solution me suffit pour ce que je veux faire...
Merci encore pour vos réponses.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
// Reçoit les événements NouvelleTrameEventArgs
// Note : ReceptionTrame() est appelé par le processus qui crée l'événement (soit un autre thread que celui de la Form)
// ReceptionTrame() n'a donc pas directement accès aux contrôles de la form.
public void ReceptionTrame(EventArgs e) {
NouvelleTrameEventArgs trame = e as NouvelleTrameEventArgs; // Tente de convertir e en NouvelleTrameEventArgs
if (trame != null)
{
DefTrame nouvelleTrame = trame.Trame;
messageLabel.Text = "Nouvelle trame reçue :" + nouvelleTrame.ToString();
SystemSounds.Beep.Play();
listBox_Trame.BeginInvoke(new DelegateListBox_Trame(DelegateAddItem_Trame), nouvelleTrame);
}
}
// Délégué pour appeler DelegateAddItem_Trame de façon thread-safe
private delegate void DelegateListBox_Trame(DefTrame element);
// Méthode appelée par un délégué pour opération thread-safe sur listbox_Trame
private void DelegateAddItem_Trame(DefTrame element)
{
listBox_Trame.Items.Add(element);
} |
Façon simple de vérifier si ma listBox contient déjà un objet avant de l'ajouter ?
Une nouvelle question qui est la suite directe de la solution précédente :
y a t il un moyen de vérifier que ma listbox contient un objet avant de lui ajouter ce dernier ?
J'ai essayé en vain un
Code:
1 2
| if (! listBox_Trame.Items.Contains(nouvelleTrame))
listBox_Trame.BeginInvoke(new DelegateListBox_Trame(DelegateAddItem_Trame), nouvelleTrame); |
Ca retourne toujours false.
S'il faut faire une boucle pour le vérifier, je ferai ça, mais je suppose qu'il y a plus joli à faire, non ?