Item de listbox sélectionné mais non affiché

Salut

J'ai un ListBox qui contient une liste de références de documents. Quand on sélectionne un document le listbox est régénéré pour n'afficher que les documents correspondants aux critères du document sélectionné (l'émetteur et le type).

Avant cette régénération je mémorise le document sélectionné dans une variable (Clé_document) et une fois régénéré je fais une boucle sur les items affichés pour resélectionner le document initial.

For i = 0 To ListeDocuments.ListCount - 1
    If Val(ListeDocuments.List(i, 6)) = Clé_document Then
        ListeDocuments.Selected(i) = True
        Exit For
    End If
Next i

Mon problème est que si l'item en question est bien resélectionné par le

ListeDocuments.Selected(i) = True

(l'espion me le confirme), il n'est pas affiché comme sélectionné (surligné en bleu). Et si je le sélectionne manuellement il se surligne en bleu mais ça ne déclenche pas l'évènement ListBox_Change.

J'ai essayé un Me.Repaint mais sans résultat.

Est ce qu'il y a une subtilité que j'ai loupée ?

Manu

Ah oui y'a une subtilité...

En testant d'autres sélections j'ai trouvé l'origine du problème. En fait quand on clique sur un item du ListBox l'évènement ListBox_Change est activé et la procédure associée est exécutée.

Mais une fois qu'elle est terminée un deuxième clic semble pris en compte. J'explique

Voilà à quoi ressemble ma liste initiale :

liste complete

Quand je clique sur la deuxième ligne de la liste initiale (la référence 1001606), la régénération du ListBox réduit le nombre d'items à 2, celui choisi étant maintenant le premier. J'ai confirmé (par une exécution pas à pas) que la procédure associée à l'évènement ListBox_Change est correctement déroulée et le premier item est bien sélectionné comme prévu.

Mais une fois qu'elle est terminée, l'item de la deuxième ligne, celle cliquée, est sélectionné (la valeur ListeDocuments.selected(1) passe de False à True une fois le End Sub passé), à priori sans qu'aucune action ne le justifie, et la procédure associée à l'évènement ListBox_Change est relancée et j'obtiens ça :

clic 2eme ligne

Quand je clique sur la 3ème ligne de la liste initiale, la régénération du ListBox réduit le nombre d'items à 2, celui choisi étant maintenant le 2e. Comme dit dans mon premier message ce deuxième item est bien de nouveau sélectionné. Mais le clic initial, qui était sur la troisième ligne du ListBox maintenant vide, est " doublé " et l'affichage du surlignage bleu est effacé sans que l'item sélectionné ne change (au delà de l'espion, les champs en bas à droite du formulaire sont remplis avec la liste sélectionnée, et sont vidés si aucune n'est sélectionnée), ce qui est le comportement normal d'un ListBox quand on clique sur une zone vide d'items.

clic 3eme ligne

J'avoue que je comprends pas...

Manu

Edit pour ajouter les images.

J'ai aussi tenté de rajouter une temporisation pour avoir le temps de déplacer le curseur de la souris entre le moment où on clique sur le ListBox et le moment où la procédure est exécutée. Ca ne change rien, la ligne cliquée est quand même sélectionnée, c'est pas un problème d'un clic qui dépasserait la durée d'exécution de la procédure.

Voilà le code de la procédure :

Private Sub ListeDocuments_Change()

If Ignorer_changements = False Then
    Ignorer_changements = True

    Clé_document = Val(ListeDocuments.List(ListeDocuments.ListIndex, 6))

    Call Remise_0_formulaire(4)

    If ListeDocuments.ListIndex = -1 Then
        MàJDocument.Enabled = False
        Ignorer_changements = False
        Exit Sub
    End If

    LabelRéférence.Enabled = True
    Référence.Enabled = True
    LabelEdition.Enabled = True
    Edition.Enabled = True
    LabelRévision.Enabled = True
    Révision.Enabled = True
    LabelAmendement.Enabled = True
    Amendement.Enabled = True
    PourPE.Enabled = True
    LabelCommentaire.Enabled = True
    Commentaire.Enabled = True
    MàJDocument.Enabled = True

    Call Report_données

    If Matériels <> "Equipement" Then Call Initialisation_ListeTypes

    If Matériels = "Equipement" Then Call Initialisation_ListePNs

    For i = 0 To ListeDocuments.ListCount - 1
        If Val(ListeDocuments.List(i, 6)) = Clé_document Then
            ListeDocuments.Selected(i) = True
            Exit For
        End If
    Next i

    Ignorer_changements = False
End If

End Sub

Manu

Bonjour,

Il faut utiliser ListIndex je pense

For i = 0 To ListeDocuments.ListCount - 1
        If Val(ListeDocuments.List(i, 6)) = Clé_document Then
            Me.ListeDocuments.ListIndex = i
            Exit For
        End If
    Next i

@+

Apparemment ça vient pas de là, ça ne change rien.

Manu

Re

Merci de joindre votre fichier SVP sans données personnelles

Le voilà. J'ai réécrit la procédure depuis que j'ai posté sur le forum mais ça n'a rien changé.

Tous les fichiers sont indispensables pour le fonctionnement, ils sont à mettre dans le même dossier.

22mnav.zip (1.02 Mo)

Il faut aller dans Module Matériel / Gérer la documentation de maitenance et sélectionner un des 3 premiers items de la liste (les autres risquent de planter, j'ai dû supprimer des milliers de lignes dans les tables de données pour que le Zip descende sous les 1,5 Mo autorisés sur le forum).

Merci d'avance pour ceux qui prendront le temps d'y jeter un coup d'oeil.

Manu

Rechercher des sujets similaires à "item listbox selectionne affiche"