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

Windows Forms Discussion :

VirtualMode avec ListView


Sujet :

Windows Forms

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2008
    Messages : 125
    Par défaut VirtualMode avec ListView
    Bonjour à tous,

    J'essai de charger plus de 50 000 lignes dans une ListView, ce qui est maintenant opérationnel grâce au VirtualMode est aux évènements associés. Mon problème est que je souhaite modifier l'ImageIndex d'un élément lors d'un click qur un bouton, et apparemment cela ne s'effectue pas.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                Dim i As Integer = lvUsers.SelectedIndices(0)
                Dim lv As New ListViewItem
                lv = lvUsers.Items(i)
                lv.ImageIndex = 3
    Savez vous si c'est faisable ou pas ? Si oui, avez vous des conseils s'il vous plait ?

    Merci à tous !

  2. #2
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2008
    Messages : 125
    Par défaut
    Personne n'a une petite idée s'il vous plait ? Je bloque vraiment sur ce point...

    Merci à tous !

  3. #3
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour

    D'ou vient la valeur 3 de ton index...car la liste "virtuelle" (liste visible) est un tout y compris les images correspondantes
    Le ImageList appartenant à la liste "virtuelle" visible est lui aussi "virtuel"
    Ton index doit donc faire reference à une image de la collection d' ImageList.Images virtuelle...!!!

    Il faut faire un test pour verifier sa validite avec l'affectation ...
    ton code devrait etre :
    Code vb.net : 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
     
     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim i As Integer = listView1.SelectedIndices(0)
            Dim lv As New ListViewItem
            lv = listView1.Items(i)
            'recupere instance du ImageList virtuel correspondant
            Dim virualImgList As ImageList = lv.ImageList
     
     
            Dim tonIndex As Integer = 3
            'test de validite de l'index 
            If virualImgList.Images.Count <> 0 And tonIndex <= virualImgList.Images.Count - 1 Then
                lv.ImageIndex = tonIndex
            End If
     
     
        End Sub
    Bon code...

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2008
    Messages : 125
    Par défaut
    Je ne vois pas quelle est la différence avec mon code ? Car l'index 3 signifie la 3ème image de ImageList...

    A quoi sert cette ligne s'il te plait ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            'recupere instance du ImageList virtuel correspondant
            Dim virualImgList As ImageList = lv.ImageList
    Merci beaucoup !

  5. #5
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour
    Je ne vois pas quelle est la différence avec mon code ? Car l'index 3 signifie la 3ème image de ImageList...
    Ton code ne verifie pas la validite de l'index d'image avant de l'assigner..
    Si je mets 1000 ton code plantera si ton cache virtuel est de 40 elements seulement cela veut dire que ImageList.Count= 40....& les index d'image seront compris entre 0 et 39...

    A quoi sert cette ligne s'il te plait ? :
    C'est pour s'assurer que j'accede au bon ImageList le "virtuel"....

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2008
    Messages : 125
    Par défaut
    Merci pour ta réponse. J'ai effectivement mis directement 3 car je connais la valeur des images de ImageList, donc je ne me souciais pas de cela, mais c'est vrai que c'est beaucoup mieux et ne causera pas d'erreur.

    Je ne savais pas que l'on pouvais changer la valeur d'une image d'un ListViewItem avec un Virtual ImageList. Je vais tester tout cela et te dirais ce que ça donne.

    Merci beaucoup !

  7. #7
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2008
    Messages : 125
    Par défaut
    Bon je confirme, malheureusement cela ne fonctionne pas. J'obtiens l'erreur suivante :

    La référence d'objet n'est pas définie à une instance d'un objet.
    sur la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If virualImgList.Images.Count <> 0 And tonIndex <= virualImgList.Images.Count - 1 Then
    Il doit donc y avoir un soucis dans le code que tu m'as fournis...

    Une idée ? Merci !

  8. #8
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    Re
    A priori ton code qui assigne les images du listimage virtuel doit etre bogue...
    Comme je ne connais pas le code ou tu crees ton cache viruel des items ,il est difficile de repondre à ta question...

  9. #9
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2008
    Messages : 125
    Par défaut
    Effectivement, c'est peut être ça le problème... Alors je t'explique. Je souhaite ajouter donc des éléments à une listview, provenant d'une requête LDAP.

    J'ai donc ma procédure de chargement qui est la suivante :

    Code vb.net : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    Private Sub bwDisplayUsers_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bwDisplayUsers.DoWork
            Try
                Dim objEntry As New DirectoryEntry(txtServer.Text, txtUsername.Text, txtPassword.Text, AuthenticationTypes.Secure)
                ' Set up to search for UserMan on the Users node
                Dim objSearcher As New DirectorySearcher(objEntry)
                objSearcher.Filter = txtFilter.Text
                objSearcher.SearchScope = SearchScope.Subtree
                objSearcher.PageSize = txtPageSize.Text
                Dim objSearchResult As SearchResultCollection
                ' Find the user
                objSearchResult = objSearcher.FindAll()
                userlist = New ArrayList
                For Each searchResult In objSearchResult
                    ' Iterate through each property name in each SearchResult.
                    Dim propertyKey As Object
                    For Each propertyKey In searchResult.Properties.PropertyNames
                        Dim valueCollection As ResultPropertyValueCollection = searchResult.Properties(propertyKey)
                        ' Iterate through values for each property name in each SearchResult.
                        Dim propertyValue As Object
                        For Each propertyValue In valueCollection
                            If propertyKey = "cn" Then
                                givenName = propertyValue.ToString()
                            End If
                            If propertyKey = "samaccountname" Then
                                uid = propertyValue.ToString()
                            End If
                            If propertyKey = "sn" Then
                                sn = propertyValue.ToString()
                            End If
                            If propertyKey = "legacyexchangedn" Then
                                objdistname = propertyValue.ToString()
                            End If
                            If propertyKey = "cn" Then
                                cn = propertyValue.ToString()
                            End If
                            If propertyKey = "mail" Then
                                mail = propertyValue.ToString()
                            End If
                            If propertyKey = "adspath" Then
                                adpath = propertyValue.ToString()
                            End If
                            If propertyKey = "nETBIOSName" Then
                                dc = propertyValue.ToString()
                            End If
                        Next propertyValue
                    Next propertyKey
                    Dim user As String() = New String() {uid, givenName, sn, txtServer.Text.Split("/")(2), mail, adpath, objdistname, 0}
                    userlist.Add(user)
                    sn = ""
                    cn = ""
                    mail = ""
                    adpath = ""
                    givenName = ""
                    uid = ""
                Next searchResult
            Catch ex As Exception
                MsgBox(ex.Message, vbCritical, "Erreur3")
                tLoadUsers.Enabled = False
            End Try
        End Sub

    Ensuite, j'utilise donc la procédure suivante pour l'ajout à la ListView :

    Code vb.net : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
     Private Sub lvUsers_RetrieveVirtualItem(sender As Object, e As RetrieveVirtualItemEventArgs) Handles lvUsers.RetrieveVirtualItem
            Try
                Dim user As String() = userlist(e.ItemIndex)
                Dim it As New ListViewItem(user(0))
                it.StateImageIndex = 0
                If currentUsers.Contains(user(4)) Then
                    it.ImageIndex = 1
                Else
                    it.ImageIndex = 2
                End If
                it.SubItems.Add(user(1))
                it.SubItems.Add(user(2))
                it.SubItems.Add(user(3))
                it.SubItems.Add(user(4))
                it.SubItems.Add(user(5))
                it.SubItems.Add(user(6))
                If user(7) > 0 Then
                    it.ImageIndex = user(7)
                End If
                e.Item = it
            Catch ex As Exception
                MsgBox(ex.Message, vbCritical, "Erreur2")
                tLoadUsers.Enabled = False
            End Try
        End Sub

    Et au final :

    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     Private Sub bwDisplayUsers_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bwDisplayUsers.RunWorkerCompleted
            Try
                lvUsers.VirtualListSize = userlist.Count
                lblNbUsers.Text = userlist.Count
                tLoadUsers.Enabled = False
            Catch ex As Exception
                MsgBox(ex.Message, vbCritical, "Erreur4")
            End Try
        End Sub

    Voilà, j'ai essayé la procédure suivante, mais apparemment elle ne fonctionne pas :

    Code vb.net : 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
    18
    19
     
      Private Sub lvUsers_CacheVirtualItems(sender As Object, e As CacheVirtualItemsEventArgs) Handles lvUsers.CacheVirtualItems
            'We've gotten a request to refresh the cache.
            'First check if it's really neccesary.
            If Not (myCache Is Nothing) AndAlso e.StartIndex >= firstItem AndAlso e.EndIndex <= firstItem + myCache.Length Then
                'If the newly requested cache is a subset of the old cache, 
                'no need to rebuild everything, so do nothing.
                Return
            End If
            'Now we need to rebuild the cache.
            firstItem = e.StartIndex
            Dim length As Integer = e.EndIndex - e.StartIndex + 1 'indexes are inclusive
            myCache = New ListViewItem(length) {}
            'Fill the cache with the appropriate ListViewItems.
            Dim i As Integer
            For i = 0 To length
                myCache(i) = New ListViewItem(New String() {"1", "2", "3", "4", "5", "6", "7", "0"})
            Next i
        End Sub

    Voilà, une idée ?

    Merci beaucoup !

  10. #10
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    re

    Dans ta procedure RetrieveVirtualItem tu assignes un index d'image entre 0,1,ou 2 à l' item manquant dans le Cache..suivant tes trois cas
    Dans la procedure CacheVirtualItems charge de faire le RAZ du Cache & de le reconstituer totalement à partir de l'index depart et fin,les index d'images ne sont pas assignes aux nouveaux nouveaux items...

    Ton code devrait etre :
    Code vb.net : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
      Private Sub lvUsers_CacheVirtualItems(sender As Object, e As CacheVirtualItemsEventArgs) Handles lvUsers.CacheVirtualItems
            'We've gotten a request to refresh the cache.
            'First check if it's really neccesary.
            If Not (myCache Is Nothing) AndAlso e.StartIndex >= firstItem AndAlso e.EndIndex <= firstItem + myCache.Length Then
                'If the newly requested cache is a subset of the old cache, 
                'no need to rebuild everything, so do nothing.
                Return
            End If
            'Now we need to rebuild the cache.
            firstItem = e.StartIndex
            Dim length As Integer = e.EndIndex - e.StartIndex + 1 'indexes are inclusive
            myCache = New ListViewItem(length) {}
            'Fill the cache with the appropriate ListViewItems.
            Dim i As Integer
            For i = 0 To length
             Dim it As New ListViewItem(New String() {"1", "2", "3", "4", "5", "6", "7", "0"})
     
             If currentUsers.Contains(user(4)) Then
                    it.ImageIndex = 1
                Else
                    it.ImageIndex = 2
                End If
               'etc....
                 If user(7) > 0 Then
                    it.ImageIndex = user(7)
                 End If
     
                 myCache(i)=it
               Next i
        End Sub

  11. #11
    Candidat au Club Avatar de R1C29
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2020
    Messages : 3
    Par défaut Listview en Mode Virtuel (en 2020)
    Code source complet, sur les listview en mode virtuel en .Net Framework 4, avec "Visual Studio Community 2019"

    Pour aider, j'ai mis en ligne quelques vidéos (pour donner une bonne idée du fonctionnement du code).
    https://www.youtube.com/playlist?lis...-lm765CdN5tzSh

    Les liens vers les codes sources sont dans les commentaires ou sur :
    https://www.cmdvb.fr/category/vb-net-code-source/

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/08/2006, 20h35
  2. [C#]Aide pour gestion dataset / XML avec listview(débutant)
    Par Low-Fi dans le forum Windows Forms
    Réponses: 1
    Dernier message: 15/04/2006, 11h21
  3. probleme avec listview
    Par gaut dans le forum C++
    Réponses: 3
    Dernier message: 09/08/2004, 00h04
  4. [C#] Problème avec ListView
    Par yannick dans le forum Windows Forms
    Réponses: 4
    Dernier message: 03/06/2004, 17h29
  5. [VB6] Problèmes avec ListView
    Par FlopErik dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 12/03/2003, 16h33

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