IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

BackgroundWorker et ListView


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 98
    Par défaut BackgroundWorker et ListView
    Bonjour à tous,

    J'ai créé un bout de code me permettant d'ajouter des images dans une listview à partir des images d'une imagelist.

    Tout marche tres bien si je le met sur un clic de bouton par exemple, mais j'ai voulus mettre ma fonction "LoadImage()" dans le DoWork d'un backgroundworker, pour ne pas faire attendre l'utilsateur pendant que la liste se remplie.

    Malheuresement, quand je met la fonction dans le dowork, puis que je lance le travail avec BGW.RunWorkerAsync(), et bien il ne m'ajoute pas les images !

    J'aimerais savoir d'où viens le probleme svp, voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            For Each img As String In System.IO.Directory.GetFiles(dirsource)
                If System.IO.Path.GetExtension(img) = ".jpg" Or System.IO.Path.GetExtension(img) = ".bmp" Or System.IO.Path.GetExtension(img) = ".gif" Or System.IO.Path.GetExtension(img) = ".png" Or System.IO.Path.GetExtension(img) = ".tif" Or System.IO.Path.GetExtension(img) = ".tiff" Then
                    Dim myimage As ListViewItem = Form1.ListView1.Items.Add(img)
                    myimage.Name = img
                    myimage.Text = System.IO.Path.GetFileNameWithoutExtension(img)
                    Form1.ImageList1.Images.Add(Image.FromFile(img))
                    myimage.ImageIndex = myimage.Index
                End If
            Next

    Merci à vous,

    AliHome

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ben surtout ça devrait planter... (en tous cas en mode debug il detecte les appels cross-thread)
    Normalement tu ne dois pas modifier l'interface graphique directement à partir d'un autre thread que celui qui l'a créée. Si tu as besoin de faire ça, il faut soit que tu passes par un Invoke, soit que tu utilises l'évènement ReportProgress du BackgroundWorker.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 98
    Par défaut
    Oui tu as raison, il me met cette erreur si je met directement le code dans le dowork, mais pas si je met la fonction.

    Le problème viendrait-il de la ? Si oui, pourrais tu me dire comment utiliser le Invoke avec mon code car c'est la 1ere fois que je me sers du backgroundworker.

    j'ai essayer de m'inspirer d'un exemple mais je n'ai pas vraiment compris de quelle façon m'y prendre


    EDIT : c'est bon ! je pense avoir reussi en utilisant la methode invoke avec un délégué

    Merci à vous !

    Cordialement,

    AliHome

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    tu peux faire quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
            Delegate Sub AddListViewItemDelegate(item As ListViewItem)
     
            Sub AddListViewItem(item As ListViewItem)
                Form1.ListView1.Items.Add(item)
            End Sub
     
            For Each img As String In System.IO.Directory.GetFiles(dirsource)
                If System.IO.Path.GetExtension(img) = ".jpg" Or System.IO.Path.GetExtension(img) = ".bmp" Or System.IO.Path.GetExtension(img) = ".gif" Or System.IO.Path.GetExtension(img) = ".png" Or System.IO.Path.GetExtension(img) = ".tif" Or System.IO.Path.GetExtension(img) = ".tiff" Then
                    Dim myimage As ListViewItem = New ListViewItem(img)
                    myimage.Name = img
                    myimage.Text = System.IO.Path.GetFileNameWithoutExtension(img)
                    Form1.ImageList1.Images.Add(Image.FromFile(img))
                    myimage.ImageIndex = myimage.Index
                    Form1.Invoke(New AddListViewItemDelegate(AddressOf AddListViewItem), New Object(1) {myimage})
                End If
            Next
    Je ne pense pas qu'un Invoke soit nécessaire pour ajouter une image à la liste, vu que ce n'est pas un contrôle graphique

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 98
    Par défaut
    Merci mais bizarrement mais il ne m'ajoute pas ca bug aussi au niveau de l'ajout des image dans l'imagelist donc j'ai fais pareil avec le delegate pour ca sauf que je me retrouve avec des items "vide" sans image

    Enfin merci quand même de ton aide, j'ai réussi par moi même finalement juste avant ton poste.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par AliHome Voir le message
    Merci mais bizarrement mais il ne m'ajoute pas ca bug aussi au niveau de l'ajout des image dans l'imagelist donc j'ai fais pareil avec le delegate pour ca sauf que je me retrouve avec des items "vide" sans image

    Enfin merci quand même de ton aide, j'ai réussi par moi même finalement juste avant ton poste.
    OK ! Peux-tu poster ta solution au cas où quelqu'un d'autre a le même problème ? Merci

    et n'oublie pas le tag

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Manipuler listView depuis Backgroundworker?
    Par Gracus dans le forum C++/CLI
    Réponses: 1
    Dernier message: 01/05/2010, 13h04
  2. Une gauge dans un ListView
    Par Thom@s dans le forum Composants VCL
    Réponses: 3
    Dernier message: 22/10/2002, 10h32
  3. listview ??
    Par Galdarion dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/09/2002, 17h02
  4. ListView->Items->Clear() !!! Qques probl de perf
    Par Nicolas_a69 dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/08/2002, 11h49
  5. ListView
    Par SnickeursMan dans le forum Composants VCL
    Réponses: 2
    Dernier message: 14/08/2002, 10h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo