|
Site |
Cours VB.net |
|
|
|
Les Contrôles 'liste' |
|
|
Il y a 6 sortes de contrôle affichant des listes:
Les ListBox.
Les CheckedListBox
Les Combos
Les ListView.
Les DomainUpDown et NumericUpDown
Les TreeView
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 éléments 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 ListBox1 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.Object
Dim i As Integer
For i = 0 To 9
Ite(i) = "Item" & i
Next 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 Integer
x = 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 ¨Philippe"+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é.
- 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("Philippe") '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("Jean")
ListBox1.Tag(pos) = 2
pos = ListBox1.Items.Add("Paul")
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).
- LA solution NET+++:
On crée un DataTable (voir cours sur le base de données)
Dim dt As New DataTable
'on ajoute au DataTable une colonne 'Numero' et une colonne 'Nom'.
dt.Columns.Add("Numero")
dt.Columns.Add("Nom")
'on remplit les lignes avec les numéro et nom.
dt.Rows.Add(1, "Philippe")
dt.Rows.Add(3, "Jean")
dt.Rows.Add(2, "Paul")
dt.Rows.Add(4, "Henry")
'on indique que la source de la liste est le DataTable
MaList.DataSource = dt
'la liste affichera les noms
MaList.DisplayMember = "Nom"
'on indique quelle valeur sera retournée quand on clique sur la liste: c' est le numéro
MaList.ValueMember = "Numero"
'Quand l'utilisateur double clique sur un élément de la liste, on affiche le numéro:
Private Sub MaList_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles MaList.DoubleClick
MsgBox(MaList.SelectedValue)
End Sub
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.DragOverIndexdInsertion = ListBox2.IndexFromPoint(ListBox2.PointToClient(
New Point(e.X, e.Y)))End Sub
Les CheckedListBox
C’est une Listbox mais avec une case à cocher sur chaque ligne.
Attention : SelectedItems et SelectedIndices ne déterminent pas les éléments qui sont cochés, mais ceux qui sont en surbrillance.
La collection CheckedItems vous donne par contre les éléments cochés. La méthode GetItemChecked (avec comme argument le numéro d'index) détermine si l’élément est coché.
Exemple :
Pour déterminer les éléments cochés dans un contrôle CheckedListBox :
Tester chaque élément de la collection CheckedItems, en commençant par 0. Notez que cette méthode fournit le numéro que porte l'élément dans la liste des éléments cochés, et non dans la liste globale. Par conséquent, si le premier élément de la liste n'est pas coché alors que le deuxième l'est, le code ci-dessous affiche une chaîne du type « Item coché 1 = Dans la liste : 2 ».
If CheckedListBox1.CheckedItems.Count <> 0 Then
'S’il y a des éléments cochés une boucle balaye les éléments cochés
'(collection CheckedItems) et affiche le numéro de l’élément DANS LA LISTE toutes lignes.
Dim x As Integer
Dim s As String = ""
For x = 0 To CheckedListBox1.CheckedItems.Count - 1
s = s & "Item coché " & (x+1).ToString & " = " & « Dans la liste : »& CheckedListBox1.CheckedItems(x).ToString & ControlChars.CrLf
Next x
MessageBox.Show(s)
End If
On rappelle comme toujours que quand on parle du 3eme élément cela correspond à l’index 2.
Les ComboBox
Les listes Combo (Liste combinée) possèdent deux caractéristiques essentielles par rapport aux ListBox.
Elles sont modifiables : c’est-à-dire que l’utilisateur a la possibilité d’entrer un élément qui ne figure pas au départ dans la liste. Cette caractéristique concerne donc les données proprement dites ; cela se traduit par la présence d’une zone de texte en haut de la liste.
Elles peuvent être déroulantes ou déjà déroulée: c’est-à-dire qu’on ne voit qu’un seul élément de la liste à la fois, et qu’il faut cliquer sur la flèche du côté pour " déplier " la liste, ou bien que la liste est déjà visible. C’est la propriété DropDownList qui gère cela.

La combos du bas a sa DropDownList=Simple
L’utilisateur peut donc cliquer dans la liste (ce qui met le texte cliqué dans la zone texte), ou taper un nouveau texte.
Items.Add
(méthode) ajoute un élément à une liste.
Items.Clear (méthode) efface tous les éléments d’une liste
Items.Count (propriété) renvoie le nombre d’éléments d’une liste
Multiselect (propriété) permet la sélection multiple
Item.Remove (méthode) supprime un élément de la liste
Sorted (propriété) trie les éléments d’une liste
Comment récupérer la zone texte quand elle change ?
Elle est dans la propriété Text.
On utilise l'évènement TextChanged qui se déclenche quand le texte est modifié.
Private Sub ComboBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.TextChanged
Label1.Text = ComboBox1.Text
End Sub
Le Contrôle ListView :
De plus en plus puissant, le contrôle ListView permet d’afficher des listes multi colonnes, ou des listes avec icône ou case à cocher.
A- Liste avec sous éléments.
Ajouter un ListView nommé ListBox.
En mode conception :
La propriété View permet de déterminer l’aspect général du contrôle, elle peut prendre les valeurs :
Details permet une liste avec sous éléments et titre de colonnes.
Liste utilise un ascenseur horizontal.
LargeIcon
SmallIcone
Par programmation cela donne :
ListBox.View= View.Details
Utilisons le mode détails (Appelé mode Rapport)
Exemple : Faire un tableau de 3 colonnes, mettre les nombres de 1 à 100 dans la première, leur carré dans la seconde, leur cube dans la troisième.

1-Comment remplir les en-têtes de colonnes?
En mode conception, dans la fenêtre propriété du ListView, il y a une propriété Columns, le fait de cliquer sur le bouton d’expansion (…) ouvre une fenêtre, cliquer sur ‘Ajouter’ permet d’ajouter une colonne ; la propriété Text permet de donner un libellé qui apparaîtra en haut de la colonne. On peut ainsi nommer les 3 colonnes (« Nombre », « Carré », « Cube » dans notre exemple)
Par programmation on peut aussi créer des colonnes; cela donne:
ListBox.Columns.Add ("Nombre", 60, HorizontalAlignment.Left)
ListBox.Columns.Add ("Carré", 60, HorizontalAlignment.Left)
ListBox.Columns.Add ("Cube", 60, HorizontalAlignment.Left)
Une autre manière est de créer une colonne et de l'ajouter:
Dim MyCol1 As ColumnHeader = New ColumnHeader
MyCol1.Text = "Nombre"
MyCol1.Width = 60
MyCol1.TextAlign = HorizontalAlignment.Center
ListBox.Columns.Add(MyCol1)
Si on créer 3 columns (MyCol1 , MyCol2, MyCol3), on peut les ajouter en une fois avec AddRange.
Dim cols() As ColumnHeader = {MyCol1, MyCol2, MyCol3}
ListBox.Columns.AddRange(cols)
2-Comment remplir le tableau?
Pour remplir le tableau, on pourrait, sur la ligne Items de la fenêtre des propriétés, cliquer sur … et rentrer les valeurs ‘à la main’. On le fait le plus souvent par programmation:
Pour chaque ligne il faut créer un objet ListViewItem:
sa propriété Text contient le texte de la première cellule
j’ajoute à cet objet des SubItems qui correspondent aux cellules suivantes.
Enfin j’ajoute le ListViewItem au contrôle ListView.
Dim i As Integer
For i = 1 To 100
Dim LVI As New ListViewItem
LVI.Text = i.ToString 'première cellule
LVI.SubItems.Add((i * i).ToString) 'seconde cellule
LVI.SubItems.Add((i * i * i).ToString) 'troisième cellule
ListBox.Items.Add(LVI) 'ajout de la ligne
Next i
Autre manière: ajouter la ligne ' 2 4 8'
Dim MyLine As ListViewItem = New ListViewItem("2")
Dim subLine As ListViewItem.ListViewSubItem = New ListViewItem.ListViewSubItem(MyLine, "4")
MyLine.SubItems.Add(subLine)
subLine = New ListViewItem.ListViewSubItem(MyLine, "8")
MyLine.SubItems.Add(subLine)
MyLine.SubItems.Add(subLine)
ListBox.Items.Add(MyLine)
3-Comment relire une cellule, récrire dans une cellule?
Voyons d'abord comment on peut localiser une cellule:
| ListBox.Items(0).Subitems(0).text | ListBox.Items(0).Subitems(1).text | ListBox.Items(0).Subitems(2).text |
| ListBox.Items(1).Subitems(0).text | ListBox.Items(1).Subitems(1).text | ListBox.Items(1).Subitems(2).text |
| ... | ... | ... |
Les lignes sont contenues dans la collection Items.
La première ligne est ListBox.Items(0), la seconde ligne: ListBox.Items(1)...
Les cellules sont contenues dans la collection Items().SubItems.
La première cellule est ListBox.Items(0).SubItems(0) ou ListBox.Items(0).Text , la seconde ListBox.Items(0).SubItems(1).
Pour lire le texte de la seconde ligne seconde colonne:
Texte=ListBox.Items(1).SubItems(1).
Pour écrire dans une cellule:
listBox.Items(1).SubItems(1).Text = "88"
Comment intercepter le numéro de la ligne qui a été cliquée par l’utilisateur (et l’afficher)?
Private Sub Listview1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Listview1.Click
Label1.Text = Listview1.SelectedIndices(0).ToString
End Sub
Si la propriété MultiSelect est à False il y a, bien sur, une seule ligne sélectionnée, sinon les lignes sélectionnées sont dans la collection SelectedIndices().
Si on veut récupérer le texte de la ligne sélectionnée, il faut utiliser :
ListBox.SelectedItems(0)
Pour récupérer les textes de toutes les lignes sélectionnées:
Private Sub ListView1_SelectedIndexChanged_UsingItems (ByVal sender As Object, ByVal e As System.EventArgs) Handles ListView1.SelectedIndexChanged
Dim groupeItem As ListView.SelectedListViewItemCollection = Me.ListView1.SelectedItems
Dim item As ListViewItem
Dim myText As String
For Each item In groupeItem
Mytext += item.SubItems(1).Text
Next
TextBox1.Text = Mytext
End Sub
Si la propriété GridLine est à True, des lignes matérialisant les cases apparaissent.
Si la propriété CheckedBox est à True , des cases à cocher apparaissent.
listBox.LabelEdit =
True autorise la modification d'une cellule de la première colonne (pour modifier, il faut cliquer une fois (sélection) puis une seconde fois (modification). Pour le colonnes suivantes, il n'y a pas d'édit.
Attention : si la somme des colonnes est plus large que le contrôle, un ascenseur horizontal apparaît !!
Pour ne pas voir cet ascenseur, ruser sur la largeur des colonnes (c’est le 2eme paramètre de la méthode .Columns.Add)
Afficher des images dans les SubItems en VB 2005: voir annexe en bas de page
B- Liste d'icônes.
Permet de faire un menu d'icône à gauche d'un formulaire, du plus bel effet:
La propriété View permet de déterminer l’aspect général du contrôle, ici on la met à la valeur LargeIcon.
Voyons certaines propriétés du Listview (nommé menu_graphique):
Dock= Left 'cela le 'colle' sur le rebord gauche.
MultiSelected= False 'on n'utilise qu'un bouton à la fois.
Activation= OnClick 'les icônes marchent comme des boutons
LabelEdit= False 'impossible de modifier le texte sous les icônes
LargeIconeList= NOMdeIMAGELIST
'En effet, il faut créer un contrôle ImageList y mettre les images du menu et indiquer au Listview le nom de l'ImageList dans la propriété LargeIconeList.
Dans la collection Items du Listview (fenêtre des propriétés), dans chaque élément, ImageIndex donne le numéro de l'image du imageList à mettre dans l'élément (ainsi que le texte qui est sous l'image).
Quand l'utilisateur clique sur une image, la procédure suivante se déclenche:
Private Sub menu_graphique_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles menu_graphique.Click
Select Case menu_graphique.SelectedItems(0).Text
Case "Rendez-vous"
...
Case "Quitter"
Application.Exit()
End Select
End Sub
On voit que menu_graphique.SelectedItems(0).Text permet de savoir sur quel bouton l'utilisateur à cliqué et ainsi d'appeler la procédure correspondant au choix de l'utilisateur.
Le Contrôle DomainUpDown :
Le contrôle DomainUpDown permet d’afficher une liste occupant peu de place: on ne voit qu'une ligne, on se déplace avec les boutons up et down:
On charge la liste avec:
MondomainUpDown.Items.Add("une ligne")
Quand l'utilisateur change de ligne cela déclenche SelectedItemChanged. Le texte sélectionné est dans SelectedItem.
La sub suivante affiche dans une messageBox l'index et le texte sélectionné.
Private Sub MondomainUpDown1_SelectedItemChanged _ (sender As System.Object, e As System.EventArgs)
MessageBox.Show(("Index sélectionné: " & MondomainUpDown1.SelectedIndex.ToString() & _ ControlChars.Cr & "Item sélectionné: " & MondomainUpDown1.SelectedItem.ToString()))
End Sub
Attention la liste contient des objets, il peut être nécessaire lorsqu'on utilise un des items de caster l'objet en string grace à ToString.
Il existe aussi un contrôle NumericUpDown.
Le Contrôle TreeView :
Le contrôle TreeView permet d’afficher des listes 'arborescentes' avec des noeuds.
Un arbre (Tree) est composé de noeuds (nodes) qui sont des objets.
Chaque noeud est composé d'une Image et d'un Text.
Les noeuds du premier niveau sont dans la collection Nodes du TreeView, ils sont repérés par un index unique.
MyTree.Nodes(0) est le premier noeud.
Avec l'image ci dessus:
MyTree.Nodes(0).Text = "Paul" 'collection dont le premier élément est zéro
MyTree.Nodes(1).Text = "Luc" 'c'est bien le second élément du premier niveau
MyTree.Nodes(2).Text
retourne une erreur: la collection ne comporte que les noeuds du premier niveau.
Chaque noeud à un Parent (au dessus), des noeuds enfants (au dessous)
MyTree.Nodes(10).Children
'retourne le nombre d'enfant
Pour voir les enfants il y a plusieurs méthodes:
MyTree.Nodes(0).Nodes(0).Text = "Odile" ' on utilise la collection Nodes du noeud Nodes(0)
MyTree.Nodes(0).FirstNode.Text = "Odile" ' on utilise FirstNode qui donne le premier enfant.
Il existe aussi LastNode.
NextNode, PrevNode Parent permettent, par rapport à un noeud (sur une instance de noeud et pas sur nodes()), de voir respectivement le noeud suivant, le précédent au même niveau ou le noeud parent.
MyTree.Nodes(0).FirstNode.NextNode permet dans les enfants de Nodes(0), de voir celui qui est après le premier.
On peut modifier l'image:
MyTree.Nodes(7).Image = "closed"
Nombre de noeuds:
MyTree.GetNodeCount(True) donne le nombre de noeuds (noeuds enfants compris car l'argument est True).
MyTree.GetNodeCount(False) donne les noeuds de premier niveau
Pour ajouter des noeuds en mode Desig, utiliser la propriété Nodes dans la fenêtre de propriété. Cela donne accès à une fenêtre qui permet de rajouter des noeuds au même niveau ou des noeuds enfants.
On peut aussi ajouter un noeud par code (au niveau de 'Paul' et 'Luc')
A partir d'un noeud, on travaille sur la collection nodes et la méthode Add de cette collection.
MyTree.Nodes.Add("Lucienne")
On peut ajouter un noeud sous le noeud sélectionné.
MyTree.SelectedNode.Nodes.Add("toto")
ou en développant:
Dim node As System.Windows.Forms.TreeNode
node = MyTree.SelectedNode
node.Nodes.Add("Nouveau noeud sous la sélection")
On peut enlever un noeud:
MyTree.Nodes.RemoveAt(0)
Un noeud peut être expanded or collaped on peut modifier l'état de l'arbre par CollapsedAll ou ExpandedAll , on peut travailler sur les noeuds visibles, voir ou non les '+' et les '-' grâce à la propriété ShowPlusMinus.
Le noeud sélectionné par l'utilisateur est dans SelectedNode
Dim node As System.Windows.Forms.TreeNode
node = MyTree.SelectedNode
MyTree.SelectedNode.Text retourne 'Tree Node: Paul' si on a cliqué sur le premier noeud.
Quand on est perdu FullPath donne le chemin du noeud.
Comment savoir si l'utilisateur à sélectionné un noeud, ou double cliqué sur un noeud?
On utilise les procédures évènements suivantes:
Private
Sub MyTreeAfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles MyTree.AfterSelect End SubPrivate Sub MyTreeDoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyTree.DoubleClick
TextBox1.Text = TreeView1.SelectedNode.ToString
End Sub
(Exemple librement inspiré de Microsoft)
Dim node As TreeNode
node = MyTree.Nodes.Add("Noeud de niveau 1")
node.Nodes.Add("noeud de niveau 2")
' Créer une ArrayList pour Customer objects.
Private MyClientArray As New ArrayList()
Private Sub FillMyTreeView()
' On ajoute des éléments à l'ArrayList.
Dim x As Integer
For x = 0 To 999
MyClientArray.Add(New MyClient("MyClient" +
x.ToString()))
Next x
' On ajoute des commandes (order) pour chaque client dans ArrayList.
Dim MyClient1 As MyClient
For Each MyClient1 In MyClientArray
Dim y As Integer
For y = 0 To 14
MyClient1.MyClientOrders.Add(New Order("Order" + y.ToString()))
Next y
Next MyClient1
' on met d'un curseur d'attente.
Cursor.Current = New Cursor("MyWait.cur")
' on gèle la mise à jour du contrôle.
MyTree.BeginUpdate()
' on efface le précédent contenu.
MyTree.Nodes.Clear()
' On ajoute des root TreeNode pour chaque MyClient object.
Dim MyClient2 As MyClient
For Each MyClient2 In MyClientArray
MyTree.Nodes.Add(New TreeNode(MyClient2.MyClientName))
' on ajoute des TreeNode enfant pour chaque commande (Order) object .
Dim order1 As Order
For Each order1 In MyClient2.MyClientOrders
MyTree.Nodes(MyClientArray.IndexOf(MyClient2)).Nodes.Add(
_
New TreeNode(MyClient2.MyClientName + "." + order1.OrderID))
Next order1
Next MyClient2
' On permet la mise à jour.
MyTree.EndUpdate()
' On remet le curseur normal.
Cursor.Current = System.Windows.Forms.Cursors.Default
End Sub
Annexe: Afficher des images dans un ListView :
Débutant s'abstenir.
De plus en plus puissant: on a vu que dans le mode 'détails' d'un ListView, on avait des colonnes de SubItems. Comment afficher des images dans ces cellules?
Il faut mettre la propriété du ListView OwnerDraw à True, cela permet au programmeur d'utiliser la Sub DrawSubItem qui se déclenche quand le subitem doit être dessiné et de dessiner soi même dans la cellule en utilisant l'argument e qui correspond au bitmap de la cellule.
Dans cette sub DrawSubItem, par exemple, au lieu d'afficher un + dans la première colonne , j'affiche une image (avec e.Graphics.DrawImage). Si par contre je veux laisser s'afficher le texte normal, je dois écrire e.DrawDefault = True.
Private
Sub ListView1_DrawSubItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewSubItemEventArgs) Handles ListView1.DrawSubItem If e.ColumnIndex = 1 ThenIf e.SubItem.Text = "+" Then
e.Graphics.DrawImage(Image.FromFile("c:\b.bmp"),
New Point(e.Bounds.X, e.Bounds.Y)) Elsee.DrawDefault =
True End If elsee.DrawDefault =
True end if End SubNe pas oublier d'afficher normalement les têtes de colonnes.
Private
Sub ListView1_DrawColumnHeader(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewColumnHeaderEventArgs) Handles ListView1.DrawColumnHeadere.DrawDefault =
True End Sub
|
|
|
|
|