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 :
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 :
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.
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
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.
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