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

IHM Discussion :

Sélection par listes interposées [AC-2010]


Sujet :

IHM

  1. #1
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 342
    Points : 4 299
    Points
    4 299
    Par défaut Sélection par listes interposées
    Bonjour,


    Je suis en train de créer un formulaire, et je galère un peu.

    Dans mon formulaire, j'ai 2 zones de listes, que je voudrais faire correspondre, dans le sens où je voudrais mettre des éléments de ma liste de Gauche vers ma Liste de Droite, et vice-versa, via un bouton.

    Ma liste de gauche est issue d'une requête sur une table pour la renseigner dès le chargement du formulaire.

    Je voudrais donc pouvoir sélectionner des éléments de cette liste, pour les "basculer" à droite. Pour cela, j'ai écrit ce code :

    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
    18
    19
    20
    21
    22
    Private Sub TransfererUn(lstSource As ListBox, lstCible As ListBox)
    ' Vérifier qu'un élément est sélectionné
    If lstSource.ListIndex = -1 Then
        MsgBox "Sélectionnez un élément au préalable !", vbInformation
        Exit Sub
    End If
    ' Déplacer l'élément dans l'autre liste
     
    For i = lstSource.ListCount - 1 To 0 Step -1
        If lstSource.Selected(i) = True Then
            ValeurPourAutreListe = ""
        ' Déplacer l'élément dans l'autre liste
            For j = 0 To lstSource.ColumnCount - 1
                ValeurPourAutreListe = ValeurPourAutreListe & lstSource.Column(j, i) & ";"
            Next j
                Debug.Print ValeurPourAutreListe
                lstCible.AddItem Left(ValeurPourAutreListe, Len(ValeurPourAutreListe) - 1)
            ' suppression de la liste source
            lstSource.RemoveItem i
        End If
    Next i
    End Sub
    Sachant que ce sont des listes à plusieurs colonnes, déjà pour ajouter des éléments, je suis obligé d'utiliser le Additem (ou en tout cas je vois pas d'autres moyens...) et donc récupérer les valeurs de ma ligne sélectionnée de ma liste source, pour après pouvoir les rajouter à ma liste cible.

    Par contre, le removeitem ne fonctionne pas, car ma liste de gauche, comme je vous l'ai dit, est le résultat d'une requête.

    Au moment du remove, il me dit que ma liste source doit être paramétrée en "Liste valeurs", ce qui m'arrange pas des masses.
    Si je la transforme en "Liste Valeurs", ça veut dire qu'au chargement de mon formulaire, je dois faire des additem pour chaque ligne de ma requête, ce qui n'est pas idéal, je pense.

    Donc je voudrais savoir si vous connaissiez un moyen de contourner cela, et surtout cette erreur.

    Merci pour vos retours, en espérant avoir été clair dans ma demande.

  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 840
    Points : 14 944
    Points
    14 944
    Par défaut
    bonjour,
    en effet, il n'est pas possible de "manipuler" des éléments d'une zone de liste si elle est issue d'une requête. Pour t'en sortir, il va falloir, passer par un subterfuge en utilisant 3 listes : masquer la 1ère liste de valeurs issue de la requête et copier les éléments de cette liste dans ta liste 2ème de gauche (liste de valeurs) et la 3ème liste de droite (liste de valeurs) pour tes choix.

  3. #3
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 342
    Points : 4 299
    Points
    4 299
    Par défaut
    Pourquoi 3 ? Parce que la 2e, faut que je l'alimente avec la première qui est extrait de la requête ? C'est bien dans ce sens-là ?

    merci pour ta réponse en tout cas

  4. #4
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 840
    Points : 14 944
    Points
    14 944
    Par défaut
    Bonjour,
    Oui, c'est bien çà, celle contenant la requête sera invisible.

  5. #5
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 342
    Points : 4 299
    Points
    4 299
    Par défaut
    J'avais bien compris alors Merci

  6. #6
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 342
    Points : 4 299
    Points
    4 299
    Par défaut
    Re,


    Finalement, j'ai encore un problème avec ma requête :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Private Sub TransfererUn(lstSource As ListBox, lstCible As ListBox)
    ' Vérifier qu'un élément est sélectionné
    If lstSource.ListIndex = -1 Then
        MsgBox "Sélectionnez un élément au préalable !", vbInformation
        Exit Sub
    End If
    ' Déplacer l'élément dans l'autre liste
    'lstCible.AddItem lstSource
     
    For i = lstSource.ListCount - 1 To 0 Step -1
        If lstSource.Selected(i) = True Then
            Index = i
            ValeurPourAutreListe = ""
        ' Déplacer l'élément dans l'autre liste
            For j = 0 To lstSource.ColumnCount - 1
                ValeurPourAutreListe = ValeurPourAutreListe & lstSource.Column(j, i) & ";"
            Next j
                'Debug.Print ValeurPourAutreListe
                lstCible.AddItem Left(ValeurPourAutreListe, Len(ValeurPourAutreListe) - 1)
            For k = lstSource.ListCount - 1 To 0 Step -1
                If lstSource.Selected(k) = True Then
                    MsgBox k
                End If
            Next k
            ' ... et le supprimer de la liste de gauche
            lstSource.RemoveItem Index
        End If
    Next i
    End Sub
    Donc cette fonction est utilisée pour alimenter une zone de liste via une zone de liste initiale, et via un bouton on lance cette procédure.
    Dans ma liste de départ, j'ai mis la possibilité de pouvoir choisir plusieurs éléments (en mode "étendu").

    Si je sélectionne un élément, pas de souci, ça marche. Par contre,si j'en sélectionne plus qu'un, il n'y en a qu'un qui est transféré.
    Quand je fais une boucle pour voir les éléments sélectionnés, il voit bien que j'en ai plus qu'un, par contre, dès que modifie ma lstSource, il n'y en a "qu'un" qui est vu.

    Dans ma procédure, par curiosuité, j'ai rajouté une boucle après le removeitem, comme ceci :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Private Sub TransfererUn(lstSource As ListBox, lstCible As ListBox)
    ' Vérifier qu'un élément est sélectionné
    If lstSource.ListIndex = -1 Then
        MsgBox "Sélectionnez un élément au préalable !", vbInformation
        Exit Sub
    End If
    ' Déplacer l'élément dans l'autre liste
    'lstCible.AddItem lstSource
     
    For i = lstSource.ListCount - 1 To 0 Step -1
        If lstSource.Selected(i) = True Then
            Index = i
            ValeurPourAutreListe = ""
        ' Déplacer l'élément dans l'autre liste
            For j = 0 To lstSource.ColumnCount - 1
                ValeurPourAutreListe = ValeurPourAutreListe & lstSource.Column(j, i) & ";"
            Next j
                'Debug.Print ValeurPourAutreListe
                lstCible.AddItem Left(ValeurPourAutreListe, Len(ValeurPourAutreListe) - 1)
            For k = lstSource.ListCount - 1 To 0 Step -1
                If lstSource.Selected(k) = True Then
                    MsgBox k
                End If
            Next k
            ' ... et le supprimer de la liste de gauche
            lstSource.RemoveItem Index
            For k = lstSource.ListCount - 1 To 0 Step -1
                If lstSource.Selected(k) = True Then
                    MsgBox k
                End If
            Next k
        End If
    Next i
     
    End Sub
    Où du coup après le remove, je regarde si mes éléments sont sélectionnés, mais là, oh bizarre : je ne rentre jamais dans cette boucle ! j'ai donc l'impression que le removeitem déselectionne tous les éléments. ça expliquerait pourquoi il me transfère qu'un élément dans ma lstCible.

    Est-ce normal ?
    Par conséquence, comme je pourrait faire pour pallier à cela ? y a -t-il possibilité de ne pas perdre ma sélection multiple ?
    Je pensais passer par une variable tableau, dans laquelle j'enregistre dans un premier temps les lignes sélectionnées, avec l'index, et une fois tous mes éléments dans ma variable tableau, je les ajoute dans ma lstCible, et je supprime dans ma lstSource.

    Avez-vous une autre idée ?


    Par ailleurs, j'ai une autre question : entre mes 2 listes, j'ai créé 2 boutons : un pour aller dans un sens, et l'autre pour remettre mon élément dans ma liste de gauche.
    Pour mon premier bouton, la procédure ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CmdTransfert_Click()
    TransfererUn Me.LstInitial, Me.LstFinale
    End Sub
    Pour mon 2e bouton, la voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CmdDetransfert_Click()
    TransfererUn Me.LstFinale, Me.LstInitial
    End Sub
    Sauf que dans ma Liste Initiale, elle était triée par ordre alphabétique suivant une certaine colonne. Quand j'utilise mon 2e bouton pour remettre un élément dans ma liste initiale, ça se rajoute à la fin de la liste, et non par rapport à l'ordre alphabétique
    Comment pourrais-je faire, en somme, pour que mes 2 listes, lors de l'ajout ou du retrait d'une liste à l'autre, je puisse avoir mes éléments qui soient triées selon une certaine colonne de ma liste ? Sachant que les éléments présents dans mes 2 listes ne sont pas issues de requêtes, mais d'éléments ajoutées "manuellement".

    En vous remerciant par avance de vos retours

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

Discussions similaires

  1. [MySQL] Sélection "tous" par liste déroulante
    Par jofdm dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/12/2012, 15h16
  2. [VB.NET][PDA]Remplir 2 textbox par liste de valeurs
    Par tostinni dans le forum Windows Forms
    Réponses: 2
    Dernier message: 12/12/2005, 21h58
  3. [SQL] récupérer sélection dans liste déroulante
    Par nerick dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 06/12/2005, 11h30
  4. Texte affiché par liste deroulante
    Par dynxd dans le forum Access
    Réponses: 20
    Dernier message: 30/09/2005, 21h37
  5. Couleur de sélection par défaut
    Par sicard_51 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 20/04/2003, 23h35

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