OVH Cloud OVH Cloud

combo box double colonnes?

17 réponses
Avatar
Ataya
Bonjour,

Mon probleme est le suivant: j'ai besoin d'un controle combobox dans
lequel je puisse mettre deux colonnes.
J'ai bien lu les posts et si j'ai bien compris le resultat est le
suivant:
avec le combo "classique" c'est impossible
avec le combo microsoft forms 2.0, c'est la m=E9merde a l'exportation

quelqu'un a t'il une solution (gratos)?

10 réponses

1 2
Avatar
Zoury
Salut Ataya ! :O)

Cette solution consiste créer l'illusion de plusieurs colonnes en subsituant
la liste déroulante par un ListBox standard permettant les Tabs. Ainsi, on
peut afficher plusieurs données sur une ligne en les séparant par des Tabs :

Substituting a Tabbed ListBox for a Combo's Dropdown List
http://vbnet.mvps.org/code/subclass/combotabbedlist.htm


Cette autre solution consiste à substituer la liste déroulante par un
ListView :

Substituting a ListView for a Combo's Dropdown List
http://vbnet.mvps.org/code/subclass/combolistview.htm

Je te suggère de faire des tests de fonctionnement afin de déterminer si
cela te convient. La liste ne réagit pas exactement comme un vrai ComboBox.
Si, par exemple, le contrôle dans le bas d'un formulaire, la liste se verra
masquer par la fin du formulaire au lieu d'apparaître par dessus. La même
chose peut se produire si tu places ta liste à un endroit et des contrôles
juste en dessous, seulement dans ce cas, on peut modifier le ZOrder afin de
la faire apparaitre au dessus.

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Ataya
bonjour et merci de ta reponse qui malheureusement ne me satisfait
guère...Je m'explique:

Ta premiere solution est dans mon cas inapplicable, en effet je veut de
"vraies" colonnes, car ici l'objectif est de mettre un index dans la
premiere colonnes et de la masquer ensuite(largeur = 0), de cette
maniere l'utilisateur choisi un texte dans la deuxieme colonne et moi
je peut utiliser l'index qui est mon veritable identifiant.

Qaund à la deuxieme solution, et bien c'est un autre probleme:le
listview. Ce charmant controle me semble bien complexe a remplir et
pour tout dire, je n'y arrive pas.

Dim myListItem As ListItem
Dim i As Integer

For i = 0 To 4
Set myListItem = MyListView.ListItems.Add(, , "truc")
myListItem.Text = "test texte???"
myListItem.SubItems(1) = "testL1 " & i '''Erreur sur cette
ligne.
myListItem.SubItems(2) = "testL2 " & i
Next i

le message d'erreur est le suivant: "valeur de propriété non valide"

Ou qu'est donc l'erreur?

Merci.
Avatar
LE TROLL
Moins académique mais plus simple, peut être... 2 listes
côte à côte, en jouant avec les propriétés...
----------

"Ataya" a écrit dans le
message de news:

Bonjour,

Mon probleme est le suivant: j'ai besoin d'un controle
combobox dans
lequel je puisse mettre deux colonnes.
J'ai bien lu les posts et si j'ai bien compris le resultat
est le
suivant:
avec le combo "classique" c'est impossible
avec le combo microsoft forms 2.0, c'est la mémerde a
l'exportation

quelqu'un a t'il une solution (gratos)?
Avatar
Jacques93
Bonjour,
Ataya a écrit :
bonjour et merci de ta reponse qui malheureusement ne me satisfait
guère...Je m'explique:

Ta premiere solution est dans mon cas inapplicable, en effet je veut de
"vraies" colonnes, car ici l'objectif est de mettre un index dans la
premiere colonnes et de la masquer ensuite(largeur = 0), de cette
maniere l'utilisateur choisi un texte dans la deuxieme colonne et moi
je peut utiliser l'index qui est mon veritable identifiant.

Qaund à la deuxieme solution, et bien c'est un autre probleme:le
listview. Ce charmant controle me semble bien complexe a remplir et
pour tout dire, je n'y arrive pas.

Dim myListItem As ListItem
Dim i As Integer

For i = 0 To 4
Set myListItem = MyListView.ListItems.Add(, , "truc")
myListItem.Text = "test texte???"
myListItem.SubItems(1) = "testL1 " & i '''Erreur sur cette
ligne.
myListItem.SubItems(2) = "testL2 " & i
Next i

le message d'erreur est le suivant: "valeur de propriété non valide"

Ou qu'est donc l'erreur?




Il faut créer les colonnes avant de les renseigner, soit par
code :

Dim myListItem As ListItem
Dim i As Integer

With MyListView.ColumnHeaders
.Add , , "Col0"
.Add , , "Col1"
.Add , , "Col2"
End With

For i = 0 To 4
Set myListItem = MyListView.ListItems.Add(, , "truc")
myListItem.Text = "test texte???"
myListItem.SubItems(1) = "testL1 " & i
myListItem.SubItems(2) = "testL2 " & i
Next i


Soit dans l'IDE :

http://cjoint.com/?flpxMV8NRO

--
Cordialement,

Jacques.
Avatar
scraper
Bonjour Ataya, dans le message
news:
tu disais :


Qaund à la deuxieme solution, et bien c'est un autre probleme:le
listview. Ce charmant controle me semble bien complexe a remplir et
pour tout dire, je n'y arrive pas.



il est vrai qu'il est un peu difficile à apprivoiser, mais ensuite, c'est
gratifiant ! :-)

essaie ça :

dans une form, ajoute un ListView (ListView1) et un CommandButton (Command1)

colle ensuite ce code dans ta feuille :

'----
Option Explicit


Private Sub Form_Load()

Dim i As Byte
Dim intX As Integer
Dim colX As ColumnHeader
Dim sList As String

Me.Width = 4800
Me.Height = 4000

With Command1
.Left = 2850
.Top = 2800
.Height = 375
.Width = 1455
.Caption = "Start"
End With


With ListView1
.View = lvwReport
.Width = 4100
.Height = 2400
.Left = 240
.Top = 240
Set colX = .ColumnHeaders.Add()
.ColumnHeaders(1).Width = 2000
.ColumnHeaders(1).Text = "Ton Titre de Cols ici"
.Checkboxes = True
End With

'Remplit le ListView
'L'index récupéré est ici la valeur de la variable i, et est placé en
première position
'sur la ligne ...
For i = 1 To 6
ListView1.ListItems.Add i, , "Clé " & i
Next

End Sub

Private Sub Command1_Click()

Dim i As Byte
Dim sList As String

For i = 1 To ListView1.ListItems.Count
If ListView1.ListItems(i).Checked Then sList = sList & i & ", "
Next
If sList <> vbNullString Then sList = Left$(sList, Len(sList) - 2)
MsgBox "Eléments sélectionnés ..." & vbCrLf & "Item(s) : " & sList,
vbInformation, "Démarrage de ton code"

End Sub

'----

cela n'a la prétention que de te montrer comment ajouter tes éléments (ici,
6 lignes, notées clé 1 à clé 6), et ensuite, en cliquant sur le command
button, de récupérer leur index

à toi d'adapter ensuite à ton code, avec gestion d'erreurs, etc ...


tu peux aussi si tu le désires, affecter une vignette à chacune de ces
lignes (il te faut pour cela incorporer un ImageList, etc ...)



--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper
Avatar
scraper
Bonjour Jacques93, dans le message
news:
tu disais :


[...]

zut, tu m'as grillé ;-)

(j'ai mis un poil trop de temps à faire cet exemple ... rofl



--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper
Avatar
Jacques93
scraper a écrit :
Bonjour Jacques93, dans le message
news:
tu disais :


[...]

zut, tu m'as grillé ;-)

(j'ai mis un poil trop de temps à faire cet exemple ... rofl




Mais tu as bien fait quand même, car j'ai oublié de mettre :

.View = lvwReport

j'ai été un poil trop rapide ;-)

--
Cordialement,

Jacques.
Avatar
Eric
Bonjour,
Ataya a écrit :
..., en effet je veut de
"vraies" colonnes, car ici l'objectif est de mettre un index dans la
premiere colonnes et de la masquer ensuite(largeur = 0), de cette
maniere l'utilisateur choisi un texte dans la deuxieme colonne et moi
je peut utiliser l'index qui est mon veritable identifiant.
...



A moins d'avoir mal compris,
Pourquoi ne pas utiliser la propriété ItemData de ta ComboBox pour
stocker les valeurs de ton Index. La ComboBox affichera 1 seule colonne
avec les textes voulus et pour le traitement tu utilises la Valeur
cbo.ItemData(cbo.ListIndex)
Tu n'as même plus besoin de masquer la colonne ;-)

Un exemple simple (Sans les déclarations de fichier, de variables ...)
qui remplit une combo d'une liste de catégories stockées dans un fichier
et stocke en ItemData le numéro de la catégorie. une combo nommée
cboCategorie sur une form.

Remplissage:

With cboCategorie
For i = 1 To NbCategorie ' fonction retournant le nb de cat
Get #3, i, Categorie ' lecture d'un enregistrement
.AddItem Trim(Categorie.NomCategorie)
.ItemData(.NewIndex) = Categorie.NumeroCategorie
Next i
End With
End With

A l'exploitation :
CodeCategorie = cboCategorie.ItemData(cboCategorie.ListIndex)

A+
Eric
Avatar
scraper
Bonjour Jacques93, dans le message
news:
tu disais :


.View = lvwReport

j'ai été un poil trop rapide ;-)



j'ai bien retenu la leçon, et ton code (ainsi que tes conseils) est bien au
chaud lol


--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper
Avatar
scraper
Bonjour Ataya, dans le message
news:
tu disais :


bonjour et merci de ta reponse qui malheureusement ne me satisfait
guère...Je m'explique:

Ta premiere solution est dans mon cas inapplicable, en effet je veut
de "vraies" colonnes, car ici l'objectif est de mettre un index dans
la premiere colonnes et de la masquer ensuite(largeur = 0), de cette
maniere l'utilisateur choisi un texte dans la deuxieme colonne et moi
je peut utiliser l'index qui est mon veritable identifiant.



au afit, comme dit Eric, peut être n'as tu pas besoin du ListView ??

si simplement tu renseignes la valeur de Index de ton Item ?

Combo1.AddItem "Mon Item", Index

Index étant le nombre de ton choix ?



--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper
1 2