Une remarque pertinente ?
Une critique impertinente ?
Un lynchage en règle ?
Une invitation sous les tropiques ?

Ecrivez-moi !
Conçu et enseigné tel qu'en lui même, avec pertes, fracas et humour de qualité supérieure            
 par Christophe Darmangeat dans le M2 PISE du Master MECI (Université Paris 7)            

 
 
 
  
 
 
 
Partie 7
Encore et toujours des contrôles
Reprenons à présent notre tour d'horizon des différents contrôles proposés par VB.Net. Bon, les Button, c'est fait. Les Label et les Textbox, on les a vues aussi, hmmm... les cases, ça y est... que reste-t-il ? Oh, tiens, ben oui :
1. La classe Listbox
La Listbox est à l'ensemble des classes de listes ce qu'est la 2CV aux automobiles : un prototype ancien et basique, mais solide, rustique, et qu'on a toujours plaisir à voir en service :
 La Listbox, par définition :
  • contient exclusivement des éléments (des Items) de type String.
  • graphiquement, se présente toujours sous une forme « développée » (ce n'est pas une liste déroulante).
  • impose un choix parmi les items proposés (ce n'est pas une liste modifiable, où l'on peut entrer une valeur qui n'est pas proposée dans la liste)
  • possède ou non une barre de défilement verticale (voire horizontale), selon le nombre d'éléments présents dans la liste et la place disponible pour les afficher (l'apparition et la disparition des barres de défilement sont gérées de manière automatique par VB, même si on peut toujours bidouiller cela via certaines propriétés).
Les Listbox, nous offrent plusieurs propriétés concernant le mode d'affichage, dont entre autres :
  • Sorted : propriété booléenne qui indique si la liste est automatiquement triée ou non.
  • Multicolumn : propriété booléenne qui permet d'afficher les items sur plusieurs colonnes.
Et une propriété fondamentale pour son comportement :
  • SelectionMode : qui  indique si l'on autorise ou non la multisélection des items de la liste.
En ce qui concerne la gestion des items de la ListBox, il faut avoir à l'esprit une chose, de laquelle se déduisent toutes les autres :
Théorème  :
Un item d'une Listbox est une chaîne de caractères, membre de la collection définie par la Listbox.
Par conséquent, ce que nous avons appris au chapitre précédent sur les collections s'applique de plein droit aux items des Listbox. Comme quoi, on dira ce qu'on voudra, mais au niveau de l'articulation pédagogique, on sent bien que ce cours est drôlement bien goupillé et qu'on a pas affaire à un amateur. Enfin, moi, ce que j'en dis, hein...
1.1 Gérer la ListBox comme une collection
Pour balayer les éléments d'une Listbox du premier au dernier, nous pourrons donc utiliser leurs numéros d'indice. Attention toutefois, la collection définie par une Listbox possède une syntaxe que nous n'avons pas encore rencontrée, mais qui obéit à une logique certaine. La Listbox étant un contrôle conteneur, on aurait pu être tenté de caractériser sa collection par Controls. Oui, mais voilà, elle ne contient pas des contrôles, mais des éléments (chaînes de caractères). Alors, sa collection est donnée par la propriété Items (avec un « s »). Bref, pour mettre tous les éléments de notre ListBox en majuscules, on pourra donc écrire :
Dim i As Integer
For i = 0 To ListBox1.Items.Count - 1
   ListBox1.Items(i) = ListBox1.Items(i).ToUpper
Next i
Remarque de bon ton :
Dans une Listbox, les éléments sont numérotés à partir de l'indice zéro, ce qui est cohérent avec le fait qu'il s'agisse d'un contrôle conteneur.
On pourra tout aussi bien utiliser la boucle For Each ... Next, par exemple ici pour récupérer tout le contenu de la liste dans une seule chaîne appelée Alaqueueleuleu. La variable servant à la boucle sera tout naturellement de type String :
Dim element As String
Dim MaListe As String = ""
For Each element In ListBox1.Items
  Alaqueueleuleu = Alaqueueleuleu & element
Next element
On peut, comme dans n'importe quelle collection, ajouter un élément dans une liste via la méthode Add :
Listbox1.Items.Add("Nouvel élément")
Pour supprimer un élément, on n'a que l'embarras du choix. La méthode Remove demandera de fournir l'élément lui-même...
Listbox1.Items.Remove("Midnight Jokers")
...tandis que la méthode RemoveAt demandera un indice :
Listbox1.Items.RemoveAt(5)
Enfin, Clear procèdera au nettoyage complet de la liste, en supprimant tous les éléments d'un seul coup d'un seul :
Listbox1.Items.Clear
1.2 Propriétés gérant la sélection
Le but d'une liste, c'est de permettre à l'utilisateur d'en sélectionner un ou plusieurs items. Cette action de l'utilisateur affectera deux propriétés à la fois :
  • SelectedItem : qui désigne sous forme de chaîne de caractères l'élément actuellement sélectionné. Si aucun élément n'est sélectionné, cette propriété vaut une chaîne vide.
  • SelectedIndex : qui désigne par son indice l'élément actuellement sélectionné. Si aucun élément n'est sélectionné, cette propriété vaut -1.
On n'a donc que l'embarras du choix pour savoir (ou, plus raremen, pour définir) l'élement actuellement sélectionn d'une liste. Par son texte ou par son indice, c'est vous qui voyez !
Plus fort : on le disait un peu plus haut, il est possible d'autoriser l'utilisateur à sélectionner plusieurs éléments à la fois en mettant la propriété SelectionMode à l'une de ses valeurs multiples (MultiSimple ou MultiExtended). Lorsque c'est le cas, on récupèrera les résultat via deux autres propriétés, qui cette fois définissent à leur tour des collections (si vous ne comprenez pas pourquoi, relisez depuis le début, mais tout cela est d'une logique imparable). Ces deux propriétés, qui font écho aux deux précédentes, sont :
  • SelectedItem pour récupérer la sélection sous forme d'une collection de chaînes de caractères
  • SelectedIndices pour la récupérer sous forme d'une collection d'indices (eh oui, « index » au pluriel, ça n'existe pas).
1.3 Évènement(s)
En ce qui concerne les événements, on peut bien sûr associer une Listbox à l'action Click. Mais ça n'est pas très malin, parce qu'on peut tout à fait changer une sélection avec son clavier, et pas avec sa souris... Un événement spécifique est donc disponible, qui ne se déclenche en cas de changement de l'item sélectionné, quelle que soit la manière dont cela se produit. Il s'agit de SelectedIndexChanged. Cet événement  est à la fois plus restrictif et plus large que le Click. Plus restrictif, car il ne se déclenche pas en cas de clic sur un item déjà sélectionné. Plus large, car il détectera un changement de sélection survenant y compris suite à une manoeuvre au clavier.
Bon, c'est pas tout ça, mais on va pouvoir utiliser notre science toute neuve :
Cet exercice n'est pas spécialement facile. Afin de graduer la difficulté, on pourra commencer par réaliser une première version, qui ne se préoccupe pas de la multisélection. Une fois que c'est au point, on introduira la case à cocher, et on modifiera le code là où c'est nécessaire.
Exercice
Exécutable
Sources
Inventaire
2. La classe Combobox
Il s'agit d'une classe-fille à la fois de la classe Listbox et de la classe Textbox. Elle en hérite donc l'essentiel des propriétés. En gros, on peut considérer qu'une ComboBox, c'est une liste modifiable et/ou déroulante :
L'aspect de la ComboBox dépend de la valeur donnée à la propriété DropDownStyle :
  • Dropdown : signifie que la zone est modifiable et déroulante
  • DropDownList : la liste est déroulante, mais non modifiable
  • Simple : la liste est modifiable, mais non déroulante
Je rappelle que le caractère déroulant d'une Combobox n'influence que son aspect, alors que son caractère modifiable influence son comportement (peut-on ou non y entrer autre chose qu'un item de la liste).

3. La classe CheckedListBox
Cette classe est une espèce de croisement entre la Listbox et la Checkbox. De la première, elle hérite toutes les propriétés hormis celles liées à la multisélection. Cette classe affiche une liste dans laquelle chaque élément est représenté avec une case à cocher  :
A noter que :
  • La propriété ThreeDCheckBoxes indique si ces cases sont en relief
  • l'événement ItemCheck est provoqué par le changement d'état (cochage ou décochage) d'un élément
  • les méthodes GetItemCheckState et SetItemCheckState s'appliquent directement au contrôle (et donc, pas à la collection ni à ses éléments). Elles permettent respectivement de connaître et de modifier l'état d'un élément (True ou False, sauf si on s'est amusé à passer les cases en mode « trois états »).
  • les propriétés CheckedItems et CheckedIndices désignent respectivement les collections CheckedListBox.CheckedItemCollection (collection des items) et CheckedListBox.CheckedIndexCollection (collection des index) des éléments cochés ou indéterminés de la liste.
Comme ça, ça a l'air compliqué, mais c'est plus laborieux que vraiment méchant.
4. La classe ImageList
Ce contrôle n'a aucun intérêt par lui-même. Mais il peut rendre des services inestimables.
Son rôle consiste à être un tableau d'images pour que d'autres contrôles viennent puiser dedans. Il s'agit d'un contrôle invisible. Ce n'est pas le seul, mais c'est le premier que nous rencontrons. Encore une fois, il ne sert que d'espace de stockage. D'ailleurs, lorsque que nous le sélectionnons dans la boîte à outils, nous voyons tout de suite qu'il ne se pose pas sur la Form, mais à côté.
On remplit le contrôle ImageList par sa propriété Images, qui désigne une collection (et à laquelle s'appliquent donc les méthodes Add et Remove, si on veut en manipuler le contenu par du code). La propriété ColorDepth permet de régler la qualité de codage des images en question, et roule Raoul : on accède ensuite aux images que contient ImageList par la propriété ImageIndex.
Ayé, on a fait le tour de ce petit contrôle. Si on s'en servait ?
Cet exercice fait fonctionner trois contrôles les uns avec les autres : la liste de cases à cocher pilote la liste déroulante, qui elle-même pilote la liste déroulante, qui elle-même provoque l'affichage des images. Pour afficher celles-ci, vous aurez besoin du contenr à images ; celui-ci s'appelle un PictureBox, et la seule propriété qui nous intéresse est celle qui désigne son contenu, en l'occurrence Image. Une dernière chose : il vous faut les 26 images des jetons de scrable. Vous les trouverez dans cette archive.
Une dernière chose, avant de vous lancer dans un code compliqué comme une usine réelle à gaz virtuel, si on fait preuve d'un peu d'astuce et qu'on prend les choses par le bon bout, le tout tient en une quinzaine de lignes simples comme bonjour (ou presque).
Exercice
Exécutable
Sources
Diaporama littéraire