-un formulaire de saisie avec une partie affichage ou il y a 5 onglets (Lundi, [...], Vendredi) dans lesquels se trouvent des ListView reprenant les onglets correspondant du classeur excel et une autre partie avec 6 champs de saisie:
-4 TextBox
-1 CheckBox "Retour"
-1 ListBox (affichée uniquement si la CheckBox est cochée) reprenant le contenu de l'onglet motif qui est une liste de motifs (en sachant qu'une variation du nombre de motif peut varier dans le temps) une colonne seulement, on peut sélectionner plusieurs motifs (c'est entre autre la raison de mon soucis)
Voilà, je souhaite que lorsque l'on double clique sur une ligne d'une ListView que les champs de mon formulaire se remplissent automatiquement, pour les TextBox et la CheckBox pas de soucis par contre pour la ListBox je ne vois pas comment savoir quelle ligne sélectionner en fonction du contenu de la cellule du classeur. Car lorsque je fais une saisie je peux choisir plusieurs éléments de la ListBox et dans la cellule je concatène par la suite chaque éléments sélectionnés que je sépare par une virgule et un espace (", "), voila j'aimerai savoir comment je pourrais récupérer chacun des éléments distinctement afin de pouvoir lorsque je double clique sur une des lignes de ma ListView que les bons motifs soient sélectionnés dans ma ListBox.
Merci d'avance pour vos réponses si vous avec des questions quelconques ou que vous souhaitez voir le code correspondant ou des captures d'écran n'hésitez pas.
Bonjour,
Je crains fort que l'on s'y perde (et probablement toi aussi) dans ces explications qui s'apparentent à un labyrinthe !
Essaye d'aller à l'essentiel, en isolant la
seule
difficulté que tu rencontres (cette seule partie, en l'isolant de tout ton contexte).
Je ne comprends par ailleurs pas où intervient, dans cette affaire, le logiciel VB.Net (sous-forum dans lequel tu as ouvert la présente discussion)
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
je développe sous VBA et j'avoue que j'ai beaucoup de mal à exprimer mon besoin donc je vais essayer de faire au plus simple.
Je saisie des enregistrements dans mon classeur par le biais d'un formulaire, j'affiche toutes les enregistrements du classeur dans un ListView et je veux que lorsque je double clique sur une ligne de ma ListView que les champs du formulaire soient remplis automatiquement avec les valeurs de la ligne afin de les modifier.
Pas de soucis pour remplir automatiquement les TextBox et checkBox, par contre un des champs est une liste à choix multiple (ListBox), car en effet dans le classeur je ne dispose que d'une seule cellule par ligne pour ce champs donc je concatène les éléments sélectionnés l'un aprés l'autre séparés d'une virgule et un espace.
Seulement lorsque qu'il s'agit de "re-sélectionner" les éléments de la ListBox pour la modification je ne voit pas comment faire y'a-t-il une solution ou dois-je faire autrement ? Merci d'avance
Si je comprends bien, tu pourrais utiliser Split avec la virgule comme séparateur. Ensuite, il te suffit de boucler le tableau généré et rechercher le même texte dans la listbox. Quand la valeur est trouvée,
Listbox.Selected(variable de boucle) = True
pour cocher.
Ça prend donc une boucle pour lire chaque item généré par le Split et une autre boucle pour trouver cette valeur dans la listbox pour la cocher.
If Me.Controls("ListView" & jour).SelectedItem.SubItems(5) <> "" Then 'testArray = Split(Me.Controls("ListView" & jour).SelectedItem.SubItems(5), ", ") testArray = Split(testString, ", ") For i = 0 To UBound(testArray) For j = 0 To ListBoxMotifs.ListCount - 1 If testArray(i) = ListBoxMotifs.List(j) Then ListBoxMotifs.Selected(j) = True GoTo Suivant End If Next j Suivant: Next i End If
Juste une petite incruste sur ce sujet pour une légère modification...
On peut éviter de se servir du Goto en sortant simplement de la boucle For j, Next :
If Me.Controls("ListView" & jour).SelectedItem.SubItems(5) <> "" Then
'testArray = Split(Me.Controls("ListView" & jour).SelectedItem.SubItems(5), ", ")
testArray = Split(testString, ", ")
For i = 0 To UBound(testArray)
For j = 0 To ListBoxMotifs.ListCount - 1
If testArray(i) = ListBoxMotifs.List(j) Then
ListBoxMotifs.Selected(j) = True
Exit For
End If
Next j
Next i
End If
Cette méthode ne changera en rien ni le temps d'exécution, ni la conso en ressources. En même temps, à ce niveau là, c'est très faible.
Le GoTo est à utiliser avec parcimonie et précautions.
En effet, trop utilisé au sein d'un même code, transforme le-dit code en "plat de spaghetti" particulièrement ardu à maintenir.
Ce n'est pas le cas ici, bien sur. C'est pourquoi je te propose juste une alternative à l'utilisation de GoTo.
Maintenant, si ton sujet est résolu, il convient de le signaler à la communauté.
Pour cela, il te suffit de cliquer sur le bouton adéquat situé au niveau de ta demande, en haut de cette page.
A++