lundi 31 mars 2008

Les contrôles de type ListBox

1.1. Utiliser les contrôles de type liste (sélection, vue, images, …)

1.1.1. Les ListBox

Le contrôle ListBox affiche une liste d'éléments (d'objets) dans laquelle l'utilisateur peut faire un ou plusieurs choix.
La liste contient "tarte", "poisson", "viande", "légumes", "sauces".
Ici l'élément "poisson" est sélectionné, la ligne correspondante est en bleu.

La listBox contient une collection d'"Item":
Elle est vide au départ.
Si j'ajoute un élément à la ListBox, cela ajoute un élément à la collection Items

ListBox1.Items est une collection contenant tous les éléments (les objets) chargés dans la liste.
La propriété Items.Count indique le nombre d'éléments contenus dans la liste . Attention le premier élément est toujours l’élément 0, aussi le nombre d’éléments est égal au numéro de l'élément le plus haut plus un.
Pour ajouter ou supprimer des élements dans un contrôle ListBox

Utilisez la méthode Items.Add, Items.Insert, Items.Clear ou Items.Remove. En mode conception, vous pouvez également utiliser la propriété Items.

Exemples :
Vider la ListBox:
ListBox1.Items.Clear()

Ajouter l'élément "poisson"
ListBox1.Items.Add("poisson")
Ajouter '4'
ListBox1.Items.Add(4.Tostring)
ou
ListBox1.Items.Add(4) 'accepté car les items sont des objets.
Insérer 'lulu en 4éme position
ListBox1.Items.Insert(4, "lulu")
Les listBox acceptent des objets, elles affichent généralement ce qu'il y a dans la propriété 'Text' de l'objet.

Charger dans une ListBox les nombres de 1 à 100
For i = 1 To 100
ListBox1.Items.Add(i.ToString)
Next i

Comment enlever des éléments?
' Enlever l'élément d'index 5:ListBox1.Items.RemoveAt(5)
' Enlever l'élément sélectionné:ListBox1.Items.Remove(ListBox1.SelectedItem)
' Enlever l'élément "Tokyo":ListBox1.Items.Remove("Tokyo")

Comment lire l'élément 3?

Dim t As String
t=ListBox1.Items(3).ToString
(En Option=Strict il est nécessaire de transformer l'objet Items(3) en String avec .ToString)

Comment rechercher l'élément qui contient une chaîne de caractères?
Dim x As Integer
x=List1.FindString("pa") retourne le numéro du premier élément commençant par 'pa'.
x=List1.FindString("pa",12) retourne le numéro de l'élément commençant par 'pa' en cherchant à partir de l'élément numéro 12.
x=List1.FindStringExact("papier") 'permet de rechercher l'élément correspondant exactement à la chaîne.

Comment sélectionner un élément par code?
ListBox1.SetSelected(x, True) 'la ligne contenant x devient bleue

L’utilisateur double-clique sur un des éléments, comment récupérer son numéro ?

Grâce à SelectedIndex.
Private Sub ListBox_DoubleClick.
N=ListBox1.SelectedIndex
End If

‘N contient le numéro de l’élément sélectionné. Attention comme d’habitude, si je sélectionne la troisième ligne c’est en faite l’élément numéro 2.
SelectedIndex retourne donc un entier correspondant à l'élément sélectionné dans la zone de liste. Si aucun élément n'est sélectionné, la valeur de la propriété SelectedIndex est égale à -1.
La propriété SelectedItem retourne l'élément sélectionné ("poisson" dans l'exemple si dessus).

Et la multi sélection, quels éléments ont été sélectionnés?
La propriété SelectionMode indique le nombre d'éléments pouvant être sélectionnés en même temps.
Lorsque plusieurs éléments sont sélectionnés, la valeur de la propriété SelectedIndex correspond au rang du premier élément sélectionné dans la liste. Les collections SelectedItems et SelectedIndices contiennent les éléments et les numéros d'index sélectionnées.
Si la propriété Sorted = True, la liste est triée automatiquement.

On peut 'charger' une ListBox automatiquement avec un tableau

En utilisant Datasource:
Dim LaList() As String = {"one", "two", "three"}ListBox1.DataSource = LaList
On peut aussi utiliser AddRange:
Dim Ite(9) As System.ObjectDim i As IntegerFor i = 0 To 9Ite(i) = "Item" & iNext i
ListBox1.Items.AddRange(Ite)
Comment 'charger' une ListBox automatiquement à partir d'un fichier texte.
ListBox1.Items.AddRange(System.IO.File.ReadAllLines("c:\list.txt"))
(le fichier list.txt est un fichier .txt crée avec NotePad par exemple et contenant les items séparés par des retours à la ligne"
Exemple de fichier:
"philippe
paul
jean
luc"


Comment connaître l'index de l'élément que l'on vient d'ajouter? (et le sélectionner)
Dim x As Integerx = List1.Items.Add("Hello")List1.SelectedIndex = x
On utilise la valeur retournée (x dans notre exemple) par la méthode Add.
(NewIndex n'existe plus en VB.NET)


Comment affecter à chaque élément de la liste un numéro, une clé?

Exemple : Dans un programme, chaque utilisateur a un nom et un numéro; je charge dans une ListBox la liste du nom des utilisateurs; quand on clique sur la liste, je veux récupérer le numéro de l'utilisateur (pas l'index de l'élément).
Comment donc, à chaque élément de la Listbox, associer un numéro (différent de l'index).

- En VB6 on utilisait une propriété (ListBox.ItemData()) pour lier à chaque élément de la ListBox un nombre (une clé); cela n'existe plus en VB.Net!!
Il existe des fonctions de compatibilité VB6, mais il faut éviter de les utiliser:
VB6.SetItemData(ListBox1, 0, 123) 'pour lier à l'élément 0 la valeur 123.

- Une alternative, pas très élégante:
Ajouter l'élément "toto"+chr$(9)+chr$(9)+ clé (clé n'est pas visible car les caractères de tabulation l'ont affichée hors de la Listbox)
Quand l'utilisateur clique sur la ligne, on récupère la partie droite donc la clé.
On peut aussi utiliser un Listview avec 2 colonnes; la seconde colonne servant à stocker le numéro.

- Une solution plus élégante:
On utilise le Tag du ListBox (Le Tag est une propriété qui peut contenir un objet (un tableau par exemple; chaque élément de ce tableau va contenir le numéro de l'utilisateur.)

Dim pos As Integer
ReDim ListBox1.Tag(100) 'Création du tableau dans le Tag

pos = ListBox1.Items.Add("Utilisateur1") 'On ajoute le nom de l'utilisateur1, pos est l'index de l'élément ajouté
ListBox1.Tag(pos) = 1 'On ajoute dans le Tag le numéro de l'utilisateur
pos = ListBox1.Items.Add("Utilisateur2")
ListBox1.Tag(pos) = 2
pos = ListBox1.Items.Add("Utilisateur3")
ListBox1.Tag(pos) = 3

'Quand l'utilisateur double-clique dans la liste, on récupère le numéro correspondant
Private Sub ListBox1_DoubleClick()
MsgBox(ListBox1.Tag(ListBox1.SelectedIndex))
End Sub

La contrainte est qu'il faut connaître le nombre maximum d'élément à charger et charger la liste dans l'ordre; il faut être en Option Strict=Off (sinon il y a liaison tardive).

Quand on charge une ListBox directement avec une base de données, il y a une solution pour gérer une clé.

Remarque:
Lorsque la propriété MultiColumn a la valeur true, la liste s’affiche avec une barre de défilement horizontale. Lorsque la propriété ScrollAlwaysVisible a la valeur true, la barre de défilement s'affiche, quel que soit le nombre d'éléments.

Comment à partir des coordonnées de la souris connaître l'élément de la liste qui est survolé?

Exemple: La souris survole ListBox2 , on a e.X et e.Y, coordonnées de l'écran, comment obtenir l'index.
On va d'abord transformer e.X et e.Y en coordonnées client (par rapport à la listBox)
ListBox2.PointToClient(New Point(e.X, e.Y)
Puis ListBox2.IndexFromPoint() va retourner l'index survolé.

Private Sub ListBox2_DragOver(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox2.DragOver
IndexdInsertion = ListBox2.IndexFromPoint(ListBox2.PointToClient(New Point(e.X, e.Y)))
End Sub

Aucun commentaire: