Cours VB.NETDate de mise à jour : 05/12/2010
VIII-H. Les 'Listes'
VIII-H-1. Les 'ListBox'
VIII-H-1-a. Pour ajouter ou supprimer des éléments dans un contrôle ListBox
VIII-H-1-b. Vider la ListBox
VIII-H-1-c. Ajouter un ou des éléments
VIII-H-1-d. Charger dans une ListBox1 les nombres de 1 à 100
VIII-H-1-e. Comment enlever des éléments ?
VIII-H-1-f. Comment lire l'élément 3 ?
VIII-H-1-g. Comment rechercher l'élément qui contient une chaîne de caractères ?
VIII-H-1-h. Comment sélectionner un élément par code ?
VIII-H-1-i. L'utilisateur double-clique sur l'un des éléments, comment récupérer son numéro ?
VIII-H-1-j. Et la multi sélection, quels éléments ont été sélectionnés ?
VIII-H-1-k. On peut 'charger' une ListBox automatiquement avec un tableau en utilisant Datasource
VIII-H-1-l. Comment 'charger' une ListBox automatiquement à partir d'un fichier texte
VIII-H-1-m. Comment connaître l'index de l'élément que l'on vient d'ajouter (et le sélectionner) ?
VIII-H-1-n. Comment affecter à chaque élément de la liste un numéro, une clé ?
VIII-H-1-o. Comment, à partir des coordonnées de la souris, connaître l'élément de la liste qui est survolé ?
VIII-H-1-p. Trier les items de la ListBox
VIII-H-1-q. Modifier l'affichage des Items dans une ListBox
VIII-H-2. Les CheckedListBox
VIII-H-3. Les ComboBox
VIII-H-4. Le Contrôle ListView
VIII-H-4-a. ListView détails
VIII-H-4-b. Liste d'icônes
VIII-H-5. Le Contrôle DomainUpDown
VIII-H-6. Le Contrôle TreeView
VIII-H-7. Annexe : Afficher des images dans un ListView
VIII-I. Fenêtres toutes prêtes (MessageBox...)
VIII-I-1. MessageBox du Framework
VIII-I-2. MsgBox du Visual Basic
VIII-I-3. InputBox
VIII-I-4. OpenFileDialog
VIII-I-5. SaveFileDialog
VIII-I-6. FolderBrowserDialog
VIII-I-7. FontDialog
VIII-I-8. ColorDialog
VIII-I-9. Créer une boite 'de dialogue' ou 'A propos de'
VIII-J. Regroupement de contrôles 'Groupe de contrôles'
VIII-J-1. GroupBox et Panel
VIII-J-2. PictureBox
VIII-J-3. TabControl
VIII-J-4. SplitContainer
VIII-J-5. LayoutPanel
VIII-J-6. Comment remplacer les groupes de contrôles de VB6 qui n'existent plus en VB.Net?
VIII-J-6-a. Évènement commun
VIII-J-6-b. Comment travailler sur plusieurs contrôles ?
VIII-K. Dimensions, position des contrôles
VIII-K-1. Unité de mesure
VIII-K-2. Position initiale dans l'écran d'un formulaire
VIII-K-3. Taille et position d'un formulaire ou d'un contrôle
VIII-K-4. Redimensionnement de fenêtre par l'utilisateur
VIII-K-5. Déplacement
VIII-K-6. Coordonnées souris
VIII-K-7. Anchor
VIII-K-8. Dock
VIII-K-9. Spliter
VIII-H. Les 'Listes'
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
VIII-H-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.
La barre de défilement verticale s'affiche si la ListBox contient plus d'élément qu'il y en a de visible.
Si ListBox.ScrollAlwaysVisible= True , la barre de défilement verticale sera toujours affichée.
VIII-H-1-a. 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.
VIII-H-1-b. Vider la ListBox
ListBox1.Items.Clear()
VIII-H-1-c. Ajouter un ou des éléments
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")
Pour ajouter plusieurs éléments en une seule fois (et éviter le scintillement de l'affichage) on utilise Items.AddRange:
Dim t () As String {" Franc " , " Norgege " , Thaïlande" }
Me. ListBox1 . Items . AddRange (t)
Me. ListBox1 . Items . AddRange (New Object () _
{" France " , " Norvege " , " Thaïlande " , _
" Australie " , " Italie " , " Espagne " })
|
Les listBox acceptent des objets, elles utilisent ToString sur l'objet pour afficher; elles affichent généralement ce qu'il y a dans la propriété 'Text' de l'objet.
VIII-H-1-d. Charger dans une ListBox1 les nombres de 1 à 100
Dim i As Integer
For i = 1 To 100
ListBox1. Items . Add (i. ToString )
Next i
|
VIII-H-1-e. Comment enlever des éléments ?
ListBox1. Items . RemoveAt (5)
ListBox1. Items . Remove (ListBox1. SelectedItem )
ListBox1. Items . Remove (" Tokyo " )
|
VIII-H-1-f. 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)
VIII-H-1-g. Comment rechercher l'élément qui contient une chaîne de caractères ?
Dim x As Integer
x= List1. FindString (" pa " )
x= List1. FindString (" pa " ,12)
x= List1. FindStringExact (" papier " )
|
VIII-H-1-h. Comment sélectionner un élément par code ?
ListBox1. SetSelected (x, True )
|
VIII-H-1-i. L'utilisateur double-clique sur l'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).
VIII-H-1-j. 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.
VIII-H-1-k. 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)
|
On peut 'charger' une ListBox avec les éléments d'une énumération:GetValues, quand on lui donne le type de l'énumération retourne la liste des éléments de l'énumération.
Enum Nom
Pierre
Paul
Jean
End Enum
ListBox1. DataSource = [Enum]. GetValues (GetType (TypeFichier))
|
VIII-H-1-l. 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"
VIII-H-1-m. 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)
VIII-H-1-n. 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"+ ControlsChar.Tab+ 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)
pos = ListBox1. Items . Add (" Utilisateur1 " )
ListBox1. Tag (pos) = 1
pos = ListBox1. Items . Add (" Utilisateur2 " )
ListBox1. Tag (pos) = 2
pos = ListBox1. Items . Add (" Utilisateur3 " )
ListBox1. Tag (pos) = 3
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).
-Enfin on peut utiliser un tableau de Structure (ou d'objets définis par une Classe), ce tableau sera utilisé comme DataSource pour la ListBox, DisplayMember sera affiché, ValueMember contiendra l'Id.
Structure NomId
Property Nom As String
Property Id As Integer
End Structure
Dim noms (10) As NomId
noms (0). Nom = " Paul "
noms (0). Id = 1
noms (1). Nom = " Philippe "
noms (1). Id = 2
noms (2). Nom = " Louis "
noms (2). Id = 3
ListBox1. DisplayMember = " Nom "
ListBox1. ValueMember = " Id "
ListBox1. DataSource = noms
Private Sub ListBox1_DoubleClick (ByVal sender As Object, ByVal e As System. EventArgs ) Handles ListBox1. DoubleClick
MsgBox (CType (ListBox1. SelectedItem , NomId). Id )
End Sub
|
Attention dans la structure il faut utiliser des Property.
Quand on charge une ListBox directement avec une base de données, c'est le même principe.
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.
VIII-H-1-o. 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
|
VIII-H-1-p. Trier les items de la ListBox
 |
Si la propriété Sorted = True, les items de la liste sont triés automatiquement.
|
VIII-H-1-q. Modifier l'affichage des Items dans une ListBox
Comment customiser sa ListBox? (Mettre l'élément selectionné en gras avec fond bleu, modifier la hauteur des items).
Si ListBox1.DrawMode = DrawMode.OwnerDrawVariable, ce n'est plus VB qui affiche automatiquement les Items.
On devra écrire le code des Sub MeasureItem (gestion dimension des items) et DrawItem (dessine l'item). Attention, il faut tracer le cadre, écrire le texte..
Friend WithEvents ListBox1 As System. Windows . Forms . ListBox
Private Sub Form1_Load (ByVal sender As System. Object , ByVal e As System. EventArgs ) Handles MyBase. Load
InitializeOwnerDrawnListBox ()
End Sub
Private Sub InitializeOwnerDrawnListBox ()
Me. ListBox1 = New System. Windows . Forms . ListBox
ListBox1. Location = New Point (20, 20)
ListBox1. Size = New Size (240, 150)
Me. ListBox1 . Items . AddRange (New Object () _
{" France " , " Norvege " , " Thaïlande " , _
" Australie " , " Italie " , " Espagne " })
ListBox1. ScrollAlwaysVisible = False
ListBox1. BorderStyle = BorderStyle. Fixed3D
ListBox1. DrawMode = DrawMode. OwnerDrawVariable
Me. Controls . Add (Me. ListBox1 )
End Sub
Private Sub ListBox1_DrawItem (ByVal sender As Object, _
ByVal e As DrawItemEventArgs) Handles ListBox1. DrawItem
If (e. State And DrawItemState. Selected = DrawItemState. Selected ) Then
e. Graphics . FillRectangle (Brushes. CornflowerBlue , e. Bounds )
e. Graphics . DrawString (Me. ListBox1 . Items (e. Index ), New Font (Me. Font , FontStyle. Bold ), _
Brushes. Black , e. Bounds . X , e. Bounds . Y )
Else
e. Graphics . FillRectangle (Brushes. Beige , e. Bounds )
e. Graphics . DrawString (Me. ListBox1 . Items (e. Index ), Me. Font , Brushes. Black , e. Bounds . X , e. Bounds . Y )
End If
e. Graphics . DrawRectangle (Pens. Blue , New Rectangle (e. Bounds . X , e. Bounds . Y , e. Bounds . Width - 1, e. Bounds . Height ))
e. DrawFocusRectangle ()
End Sub
Private Sub ListBox1_MeasureItem (ByVal sender As Object, _
ByVal e As MeasureItemEventArgs) Handles ListBox1. MeasureItem
e. ItemHeight = 20
End Sub
End Class
|

Pour afficher des images dans les Items d'une ListBox voir 'Afficher des images dans un ListView', c'est le même principe.
VIII-H-2. 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
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.
VIII-H-3. 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 combo 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
|
On peut 'charger' un combo (grâce à DataSource) avec les éléments d'une énumération:GetValues, quand on lui donne le type de l'énumération retourne la liste des éléments de l'énumération.
Enum Nom
Pierre
Paul
Jean
End Enum
Combo1. DataSource = [Enum]. GetValues (GetType (TypeFichier))
|
On peut aussi charger un tableau:
Dim t () As String = {" Paul " , " Pierre " , " Jean " }
ComboBox1. DataSource = t
|
VIII-H-4. 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.
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
VIII-H-4-a. ListView détails
Le volet de droite de l'exploreur donne une bonne idée d'une ListView détails.
Ajouter un ListView nommé ListView1.
Par programmation:
ListView1. View = View. Details
|
Cela donne 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:
ListView1. Columns . Add (" Nombre " , 60, HorizontalAlignment. Left )
ListView1. Columns . Add (" Carré " , 60, HorizontalAlignment. Left )
ListView1. 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
ListView1. 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}
ListView1. 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
LVI. SubItems . Add ((i * i). ToString )
LVI. SubItems . Add ((i * i * i). ToString )
ListView1. Items . Add (LVI)
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)
ListView1. Items . Add (MyLine)
Dim MyLine As ListViewItem= New ListViewItem ( New String () {" Lasserre " ," Philippe " , " 1951 " })
ListView1. Items . Add (MyLine)
|
Autre exemple complet: 3 colonnes (Nom, Prénom, Date de naissance), ajouter une ligne.
ListView1. View = View. Details
ListView1. Columns . Add (" Nom " , 60, HorizontalAlignment. Left )
ListView1. Columns . Add (" Prénom " , 60, HorizontalAlignment. Left )
ListView1. Columns . Add (" Année naissance " , 60, HorizontalAlignment. Left )
Dim MyLine As ListViewItem = New ListViewItem (New String () {" Lasserre " , " Philippe " , " 1951 " })
ListView1. Items . Add (MyLine)
|
On pourrait ajouter une image sur la ligne et même la couleur d'avant plan, d'arrière plan et la Font de la ligne:
Dim MyLine As ListViewItem = New ListViewItem (New String () {" Lasserre " , " Philippe " , " 1951 " }, 1, Color. Cyan , Color. Beige , Me. Font )
ListView1. Items . Add (MyLine)
|
Pour l'image, on donne en argument l'index dans l'ImageList associer au ListView.
3-Comment relire une cellule, réecrire dans une cellule?
Voyons d'abord comment on peut localiser une cellule:
ListView1.Items(0).Subitems(0).text |
ListView1.Items(0).Subitems(1).text |
ListView1.Items(0).Subitems(2).text |
ListView1.Items(1).Subitems(0).text |
ListView1.Items(1).Subitems(1).text |
ListView1.Items(1).Subitems(2).text |
... |
... |
... |
Les lignes sont contenues dans la collection Items.
La première ligne est ListView1.Items(0), la seconde ligne: ListView1.Items(1)...
Les cellules sont contenues dans la collection Items().SubItems.
La première cellule est ListView1.Items(0).SubItems(0) ou ListView1.Items(0).Text , la seconde ListView1.Items(0).SubItems(1).
Pour lire le texte de la seconde ligne seconde colonne:
Texte=ListView1.Items(1).SubItems(1).
Pour écrire dans une cellule:
ListView1. Items (1). SubItems (1). Text = " 88 "
|
De même pour les couleurs:
ListView1. Items (2). UseItemStyleForSubItems = False
ListView1. Items (2). SubItem (3). BackColor = Colors. Red
ListView1. Items (2). BackColor = Colors. Lime
|
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 :
ListView1. SelectedItems (0)
|
Comment effacer la ligne selectionnée:
ListView1. Items . RemoveAt (ListView1. SelectedIndices (0))
ListView1. Items . Remove (ListView1. SelectedItems (0))
|
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.
ListView1.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
VIII-H-4-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):
With menu_graphique
Dock= Left
MultiSelected= False
Activation= OnClick
LabelEdit= False
LargeIconeList= NOMdeIMAGELIST
End With
|
'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.
VIII-H-5. 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 grâce à ToString.
Il existe aussi un contrôle NumericUpDown.
VIII-H-6. 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
MyTexte= 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
|
Pour voir les enfants il y a plusieurs méthodes:
MyTree. Nodes (0). Nodes (0). Text = " Odile "
MyTree. Nodes (0). FirstNode . Text = " Odile "
|
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
MyTree. GetNodeCount (False ) donne les noeuds de premier niveau
|
Pour ajouter des noeuds en mode Design, 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:
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 Sub
Private Sub MyTreeDoubleClick (ByVal sender As Object, ByVal e As System. EventArgs )
- Handles MyTree. DoubleClick
TextBox1. Text = TreeView1. SelectedNode . ToString
End Sub
|
Exemple complet: sur MyTree, rentrer les clients et leurs commandes .
(Exemple librement inspiré de Microsoft, un peu complexe)
Dim node As TreeNode
node = MyTree. Nodes . Add (" Noeud de niveau 1 " )
node. Nodes . Add (" noeud de niveau 2 " )
Private MyClientArray As New ArrayList ()
Private Sub FillMyTreeView ()
Dim x As Integer
For x = 0 To 999
MyClientArray. Add (New MyClient (" MyClient " + x. ToString ()))
Next x
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
Cursor. Current = New Cursor (" MyWait.cur " )
MyTree. BeginUpdate ()
MyTree. Nodes . Clear ()
Dim MyClient2 As MyClient
For Each MyClient2 In MyClientArray
MyTree. Nodes . Add (New TreeNode (MyClient2. MyClientName ))
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
MyTree. EndUpdate ()
Cursor. Current = System. Windows . Forms . Cursors . Default
End Sub
|
Exemple plus simple:
Dim ImageList1 As New ImageList
ImageList1. Images . Add (Image. FromFile (" C:\peugeot.jpg " ))
ImageList1. Images . Add (Image. FromFile (" C:\renaud.bmp " ))
Me. TreeView1 . ImageList = ImageList1
Me. TreeView1 . ImageIndex = 0
Dim noeud1, noeud2 As TreeNode
noeud1 = New TreeNode
noeud2 = New TreeNode
With noeud1
. Text = " Peugeot "
. ImageIndex = 0
. Nodes . Add (" 307 " )
. Nodes . Add (" 205 " )
. Nodes . Add (" 309 " )
End With
With noeud2
. Text = " Renault "
. ImageIndex = 1
. Nodes . Add (" Mégane " )
. Nodes . Add (" Clio " )
. Nodes . Add (" Laguna " )
End With
With Me. TreeView1
. Nodes . Add (noeud1)
. Nodes . Add (noeud2)
End With
End Sub
Me. Controls . Add ( TreeView1)
|
VIII-H-7. 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 Then
If e. SubItem . Text = " + " Then
e. Graphics . DrawImage (Image. FromFile (" c:\b.bmp " ), New Point (e. Bounds . X , e. Bounds . Y ))
Else
e. DrawDefault = True
End If
else
e. DrawDefault = True
end if
End Sub
|
Ne 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. DrawColumnHeader
e. DrawDefault = True
End Sub
|
VIII-I. Fenêtres toutes prêtes (MessageBox...)
Il existe :
-Les MessageBox et MsgBox.
-Les InputBox
et les autres
...
Ces fenêtres toutes faites facilitent le travail :
VIII-I-1. MessageBox du Framework
Ouvre une fenêtre qui affiche un message.
C'est une fonction qui affiche un message dans une boîte de dialogue, attend que l'utilisateur clique sur un bouton (Ok ou Oui-Non..), puis retourne si on le désire, le nom du bouton cliqué par l'utilisateur.
On utilise la méthode Show pour afficher la boite.
On doit fournir le texte à afficher, on peut aussi fournir le titre dans la barre, le type de bouton , le type d'icône et le bouton par défaut, une option , la présence d'un bouton d'aide.
Syntaxe:
MessageBox. show (TexteAAfficher)
|
ou
Dim Reponse As Integer = MessageBox. show (Texte,Titre, TypeBouton , Icone, BoutonParDéfaut, Option , Bouton aide)
|
Le bouton cliqué par l'utilisateur est retourné dans Reponse (de type DialogResult.Ok).
Exemple:
Paramètres
TexteAAfficher
Obligatoire. Expression String affichée comme message de la boîte de dialogue (longueur maximale 1 024 caractères). N'oubliez pas d'insérer un retour chariot si le texte est long, cela crée 2 lignes.
Titre
Expression String affichée dans la barre de titre de la boîte de dialogue. Si l'argument Titre est omis, le nom de l'application est placé dans la barre de titre.
TypeBouton
Expression numérique qui représente la somme des valeurs spécifiant
-le nombre et le type de boutons à afficher :
MessageBoxButtons.OKOnly Un seul bouton 'Ok'
MessageBoxButtons.YesNo Deux boutons 'Oui' 'Non'
MessageBoxButtons.OkCancel 'Ok' et 'Annuler'
MessageBoxButtons.AbortRetryIgnore 'Annule' 'Recommence' 'Ignore'
MessageBoxButtons.YesNoCancel, exemple:
Icons
-le style d'icône à utiliser:
MessageBoxIcon.Error
MessageBoxIcon.Exclamation
...
L'identité du bouton par défaut
MessageBoxDefaultButton.Button1
MessageBoxDefaultButton.Button2
Les options
MessageBoxOptions.RightAlign
L'affiche d'un bouton d'aide
True pour l'afficher.
Comme d'habitude, il suffit de taper MessageBox.Show( pour que VB proposer les paramètres.
Retour de la fonction :
Retourne une constante de type DialogResult qui indique quel bouton à été pressé.
DialogResult. Yes
DialogResult. No
DialogResult. Cancel
DialogResult. Retry
DialogResult. Ok
|
Exemple 1:
Afficher un simple message:
MessageBox. Show (" bonjour " )
|
Affiche
Exemple 2:
Afficher les boutons Oui Non et un bouton d'aide, une icône d'erreur, tester si l'utilisateur a cliqué sur Oui:
Dim r As DialogResult (cela marche aussi avec Integer)
r = MessageBox. Show (" bonjour " , " Programme " , MessageBoxButtons. YesNo , MessageBoxIcon. Error ,
_ MessageBoxDefaultButton. Button1 , MessageBoxOptions. RightAlign , True )
If r = Windows. Forms . DialogResult . Yes Then
. .
End If
|
Affiche:
Ecriture plus compact:
If MessageBox. Show (" bonjour " , " Programme " , MessageBoxButtons. YesNo ) = DialogResult. Yes then
. . . . .
End If
|
VIII-I-2. MsgBox du Visual Basic
L'ancienne syntaxe Visual Basic avec MsgBox est conservée :(A éviter, préférer MessageBox).
MessageBox.Show est du Framework Net, MsgBox est du VB.
Reponse= MsgBox (TexteAAfficher, Style, Titre)
|
Dans ce cas il faut utiliser MsgBoxStyle et MsgBoxResult pour le retour. De plus les arguments ne sont pas dans le même ordre!!
-Pour le choix des boutons MsgBoxStyle peut prendre les valeurs:
YesNo (cela affiche 2 boutons "Oui" et "Non"), OkCancel, AbortRetryIgnore...
Pour le choix du bouton par défaut MsgBoxStyle peut prendre les valeurs:
DefaultButton1, DefaultButton2..
Pour les icônes MsgBoxStyle peut prendre les valeurs:
Il faut ajouter les styles les uns aux autres avec 'Or'.
Au retour on a les valeurs:
MsgBoxResult.Yes, MsgBoxResult.No, MsgBoxResult.Cancel...
Exemple simple fournissant un simple message à l'utilisateur:
MsgBox ("Bonjour") affiche une message box avec le message 'Bonjour', un bouton 'Ok' et dans la barre de titre, le nom de l'application. Il n'y a pas de valeur de retour.
Exemple courant posant une question, l'utilisateur doit cliquer sur 'oui' ou 'non', on teste si c'est 'oui':
If MsgBox (" D'accord? " , MsgBoxStyle. YesNo ) = MsgBoxResult. Yes Then
End If
|
Exemple complet :
Dim msg As String
Dim title As String
Dim style As MsgBoxStyle
Dim response As MsgBoxResult
msg = " Voulez vous continuer? "
style = MsgBoxStyle. DefaultButton2 Or _
MsgBoxStyle. Critical Or MsgBoxStyle. YesNo
title = " MsgBox Démonstration "
response = MsgBox (msg, style, title)
If response = MsgBoxResult. Yes Then
Else
End If
|
Voila ce que cela donne:
'On remarque que dans l'exemple, on crée des variables dans lesquelles on met le texte ou les constantes adéquates, avant d'appeler la fonction MsgBox. En condensé cela donne:
If MsgBox (" Voulez vous continuer? " , MsgBoxStyle. DefaultButton2 Or MsgBoxStyle. Critical Or MsgBoxStyle. YesNo , _
" MsgBox Démonstration " )= MsgBoxResult. Yes Then
End If
|
VIII-I-3. InputBox
C'est une fonction qui permet d'ouvrir une fenêtre qui pose une question :
Elle retourne la réponse tapée par l'utilisateur.
Le retour est effectué dans une variable String.
Dim Nom As String
Nom = InputBox (" Bonjour " ," Tapez votre nom ? " )
|
Cela donne :
On pourrait rajouter un 3eme argument=la réponse par défaut.
Si l'utilisateur clique sur le bouton 'Annuler', une chaîne vide est retournée.
On a souvent besoin de contrôler si l'utilisateur à tapé quelque chose puis d'enlever les espaces:
Dim reponse As String
Do
reponse= InputBox (" Tapez un nom " )
Loop Until String . IsNullOrEmpty (reponse)
reponse= reponse. Trim (" " )
|
VIII-I-4. OpenFileDialog
Comment afficher une boite de dialogue permettant de sélectionner un fichier (ou des fichiers) à ouvrir par exemple ?
Dans la boite à Outils, cliquez sur OpenFileDialog puis cliquez sur la fenêtre en cours : un contrôle OpenFileDialog1 apparaît sous le fenêtre.
Ouvre une boite de dialogue permettant de choisir un nom et un chemin de fichier, au programmeur d'écrire le code lisant les fichiers.
Dans le code, à l'endroit ou doit s'ouvrir la fenêtre,(Dans l'évènement Click d'un bouton nommé 'Ouvrir' par exemple) tapez :
Private Sub ButtonOuvrir_Click ()
OpenFileDialog1. ShowDialog ()
End Sub
|
C'est suffisant pour créer une fenêtre montrant l'arborescence des fichiers et répertoires et pour que l'utilisateur choisisse un fichier:
Mais le plus souvent on a besoin que la boite de dialogue propose un type de fichier et un répertoire précis.
Par exemple je veux ouvrir un fichier .TXT dans le répertoire c:\MesTextes
Il faut dans ce cas, AVANT le ShowDialog renseigner certaines propriétés du contrôle OpenFileDialog1 :
With OpenFileDialog1
. Title = " Ouvrir "
. InitialDirectory = " c:\ "
. Filter = " Fichiers txt|*.txt "
FilterIndex indique le filtre en cours
. Multiselect = False
. CheckFileExists = True
. ValidateNames = True
. AddExtension = True
End With
|
Comment afficher la boite et vérifier si l'utilisateur à cliqué sur 'Ouvrir'?
La méthode .ShowDialog peut retourner un élément de l'énumération DialogResult pour indiquer l'action de l'utilisateur sur la boite de dialog:
DialogResult. Ok
DialogResult. Cancel
|
Comment utiliser cela?
If OpenFileDialog1. ShowDialog = DialogResult. Ok Then
End if
|
Maintenant, OpenFileDialog1.FileName contient le nom du fichier sélectionné (avec extension et chemin).
Path. GetFileName (OpenFileDialog1. FileName )
|
En conclusion OpenFileDialog permet de selectionner un nom de fichier en vue d'une ouverture, à vous ensuite d'ouvrir et de lire le fichier.
VIII-I-5. SaveFileDialog
Boite de dialogue fonctionnant de la même manière que OpenFileDialog mais avec quelques propriétés spécifiques.
Ouvre une boite de dialogue permettant à l'utilisateur de choisir un nom et un chemin de fichier, au programmeur d'écrire le code enregistrant les fichiers.
SaveFileDialo1. CreatePrompt = True
SaveFileDialo1. OverwritePrompt = True
SaveFileDialo1. DefaultExt = " txt "
|
On récupère aussi dans .FileName le nom du fichier si la propriété .ShowDialog à retourné DialogResult.Ok.
VIII-I-6. FolderBrowserDialog
Boîte de dialogue 'Choix de répertoire' en VB2005:
Il faut instancier un FolderBrowserDialog, indiquer le répertoire de départ (RootFolder), le texte de la barre (Description) et l'ouvrir avec ShowDialog.
Le répertoire sélectionné par l'utilisateur se trouve dans SelectedPath .
Dim fB As New FolderBrowserDialog
fB. RootFolder = Environment. SpecialFolder . Desktop
fB. Description = " Sélectionnez un répertoire "
fB. ShowDialog ()
If fB. SelectedPath = String . Empty Then
MsgBox (" Pas de sélection " )
Else
MsgBox (fB. SelectedPath )
End If
fB. Dispose ()
|
VIII-I-7. FontDialog
Pour que l'utilisateur choisisse une police de caractère et modifie la police d'un contrôle List1.
Dim myFontDialog As FontDialog
myFontDialog = New FontDialog ()
If myFontDialog. ShowDialog () = DialogResult. OK Then
List1. Font = myFontDialog. Font
End If
|
VIII-I-8. ColorDialog
Pour permettre à l'utilisateur de choisir une couleur, il faut mettre dans le formulaire une ColorDialog à partir de la boite à outils; elle vient se placer sous le formulaire:
Il faut ensuite, par code, ouvrir cette ColorDialog.
La classe ColorDialog a une méthode ShowDialog, analogue à la méthode ShowDialog des classes OpenFileDialog et
Si l'utilisateur quitte la boîte de dialogue en cliquant sur le bouton 'OK', la méthode ShowDialog retourne DialogResult.OK et la couleur choisie est dans la propriété Color de l'objet ColorDialog .
Exemple:
L'utilisateur clique sur un bouton nommé 'CouleurButton' cela ouvre la ColorDialog, l'utilisateur clique sur une couleur puis sur 'Ok', cela donne aux caractères de la TextBox 'Texte' la couleur choisie.
Private Sub CouleurButton_Click (ByVal sender As Object, ByVal e As System. EventArgs ) _
Handles CouleurButton. Click
If colorDialog1. ShowDialog () = DialogResult. OK Then
Texte. ForeColor = colorDialog1. Color
End If
End Sub
|
On peut modifier la boite à notre gout avant de l'ouvrir:
colorDialog1. SolidColorOnly = True
colorDialog1. AllowFullOpen = True
colorDialog1. FullOpen = True
colorDialog1. Color = Color. Red
|
VIII-I-9. Créer une boite 'de dialogue' ou 'A propos de'
Si on a besoin dans un programme d'une boite de dialogue spécifique, il faut la créer soi même dans un nouveau formulaire:
Elle doit respecter certaines règles:
Elle doit être 'modale' (Le seul moyen d'en sortir est de la fermer) donc ouverte avec ShowDialog.
Elle est habituellement non redimensionnable (FormBorderStyle= FixedDialog).
Elle n'a pas de boutons dans la barre de titre (ControlBox, MinimizeBox, MaximizeBox= False).
La boite ne doit pas apparaitre dans la barre de tache (ShowInTaskBar =False).
Il faut ajouter à la main la ou les zones permettant de saisir les informations demandées.
Elle doit contiennir un bouton 'Ok' et un bouton 'Annuler' (ou Oui/Non. Abort, Retry, Ignore.).
Il faut géner ce qui se passe quand on clique sur ces boutons. Pour le bouton 'Ok' il faut que cela ferme la fenêtre et retourne 'Ok' à la fenêtre précédente.
1 - Si vous créez une boite de dialogue vous même (nommée Form2), il faut créer un bouton dont le texte est 'Ok'; pour ce bouton mettre la propriété DialogResult= Ok (dans la fenêtre de propriétés) ou par code:
Button1. DialogResult = DialogResult. Ok
|
Dans ce cas, si l'utilisateur clique sur le bouton 'Ok', la fenêtre modale est fermée et on retourne Ok:
Voici le code qui ouvre cette fenêtre de dialogue:
Dim f2 As New Form2
Dim Dia As DialogResult = f2. ShowDialog
MsgBox (Dia. ToString )
|
On peut de cette manière ajouter des boutons Cancel, Yes, No, Abort, Retry, Ignore..
Enfin si on veut pouvoir remplir ou récupérer le texte tapé dans un TextBox de de dialogue, le plus simple est que le bouton soit 'Public' et non Private, ainsi il sera accessible à partir d'un autre formulaire.
2 - Vb aide à faire automatiquement et rapidement une DialogBox ou une AboutBox.
Exemple en vb 2010: Menu 'Projet' puis 'Ajouter un formulaire Windows'.
Puis cliquer sur 'Boite de dialogue' ou 'Boite à propos de':
La boite 'à propos de' donne des informations sur le programme; un bouton 'Ok' permet simplement de la fermer.
La boite de dialogue utilise 'DialogResult' pour communiquer avec le formulaire qui ouvre la boite de dialogue:
Dialog1. ShowDialog ()
If Dialog1. DialogResult = DialogResult. Ok then
End if
|
VIII-J. Regroupement de contrôles 'Groupe de contrôles'
On peut regrouper des contrôles dans :
Les GroupBox.
Les Panels.
Les PictureBox.
Les TabControl.
Les SplitContainer.(Framework 2 Vb2005)
Les LayoutPanel.(Framework 2 Vb2005)
Comment se passer des groupes de contrôles de VB6 qui n'existent plus en VB.Net?
Comment plusieurs contrôles peuvent-ils déclencher un même évènement?
Comment travailler sur plusieurs contrôles identiques?
VIII-J-1. GroupBox et Panel
Il est possible de regrouper des contrôles dans un container, on peut par exemple regrouper plusieurs RadioButton. Le container peut être un GroupBox ou un Panel.
Ci dessus on a un GroupBox et un Panel avec AutoScroll =True et BorderStyle=Single
Pour l'utilisateur, le fait que toutes les options soient regroupées dans un panneau est un indice visuel logique (Tous les RadioButton permettrons un choix dans une même catégorie de données). Au moment de la conception, tous les contrôles peuvent être déplacés facilement ; si vous déplacez le contrôle GroupBox ou Panel, tous les contrôles qu'il contient sont également déplacés. Les contrôles regroupés dans un panneau ou un GroupBox sont accessibles au moyen de la propriété Controls du panneau.
Le contrôle Panel est similaire au contrôle GroupBox; mais, seul le contrôle Panel peut disposer de barres de défilement et seul le contrôle GroupBox peut afficher une légende.
La légende de la GroupBox est définie par la propriété Text.
Pour faire apparaître les barres de défilement dans le Pannel mettre AutoScroll =True et AutoScrollMinSize =100.
Dans un Panel, pour afficher des barres de défilement, donner à la propriété AutoScroll la valeur True.. La propriété BorderStyle détermine si la zone est entourée d'une bordure invisible (None), d'une simple ligne (FixedSingle) ou d'une ligne ombrée (Fixed3D).
Comment créer un contrôle Panel ?
Faites glisser un contrôle Panel de l'onglet Windows Forms de la boîte à outils jusqu'à un formulaire.
Ajoutez des contrôles au panneau en les déposant dans le panneau.
Si vous voulez mettre dans le panneau des contrôles existants, sélectionnez-les tous, coupez-les dans le Presse-papiers, sélectionnez le contrôle Panel et collez-les.
VIII-J-2. PictureBox
Le contrôle PictureBox peut afficher une image mais peut aussi servir de conteneur à d'autres contrôles.
Retenons la notion de conteneur qui est le contrôle parent.
VIII-J-3. TabControl
Ce contrôle permet de créer des onglets comme dans un classeur, onglets entièrement gérés par VB. Chaque page peut contenir d'autres contrôles.
En mode conception, en passant par la propriété TabPages, on ajoute des onglets dont la propriété Text contient le texte à afficher en haut (Ici: Page 1..). il suffit ensuite de cliquer sur chaque onglet et d'y ajouter les contrôles.
En mode run les onglets fonctionnent automatiquement: cliquez sur Page 2 affiche la page correspondante (et déclenche l'événement Click de cet objet TabPage)..
La propriété Alignment permet de mettre les onglets en haut, en bas, à droite, à gauche.
VIII-J-4. SplitContainer
A partir de VB 2005 Framework 2.
Permettant de créer facilement une séparation déplaçable entre 2 zones.
On met le SplitContainer, dans les 2 zones on met par exemple 2 textbox. Il faut mettre la propriété Dock de ces 2 textbox à Fill.
En mode Run, cela marche : si je déplace la zone de séparation centrale, cela agrandit un textbox et diminue le second.
Margin indique la largeur de la séparation.
Orientation permet une séparation horizontale ou verticale.
VIII-J-5. LayoutPanel
A partir de VB 2005 Framework 2.
Permet de positionner les contrôles dans une Form en mode conception. On ne le voit pas en mode Run.
FlowLayoutPanel: Place les contrôles à droite du précédent, passe 'à la ligne' si nécessaire, c'est génial pour créer plusieurs lignes de label, TextBox, Bouton:
TableLayoutPanel:On crée un tableau de panel, puis on met les contrôles dans les cellules:
VIII-J-6. Comment remplacer les groupes de contrôles de VB6 qui n'existent plus en VB.Net?
En VB6 on pouvait créer un groupe de plusieurs contrôles identiques et les repérer par un Index.
Texte(0), Texte(1), Texte(2)..
Pour parcourir le groupe, on avait une boucle For Next sur l'index:
For i= 1 To 10
Texte (i). text . . .
Next
|
de plus il n'y avait qu'une routine évènement pour l'ensemble du groupe.
Cela n'existe plus en VB.Net!!!!!
Comment donc remplacer un groupe de contrôle en VB.Net?
VIII-J-6-a. Évènement commun
Exemple: 3 cases à cocher permettent de colorer un label en vert rouge ou bleu. Plutôt que d'écrire 1 routine pour chaque case à cocher, je voudrais écrire une routine unique.
Comment gérer les évènements?
On peut donc écrire 3 routines complètes, une pour chaque case à cocher.
Il est aussi toujours possible dans chacune des 3 procédures CouleurX.checkedChanged de vérifier si la case est cochée et de modifier la couleur.
C'est plus élégant d'avoir une procédure unique qui, en fonction de la case à cocher qui a déclenché l'évènement, change la couleur.
On désire donc parfois que l'évènement de plusieurs contrôles différents soit dirigé sur une seule et même procédure.
Par contre par l'intermédiaire du Handles, il est possible d'associer plusieurs évènements à une seule procédure:
Private Sub CouleurCheckedChanges (ByVal sender As System. Object , ByVal e As System. EventArgs ) _
Handles CouleurVert. CheckedChanged , CouleurRouge. CheckedChanged , CouleurBleu. CheckedChanged
End Sub
|
Cette procédure est activée quand les cases à cocher CouleurVert CouleurBleu, CouleurRouge changent d'état.
A noter que Sender est le contrôle ayant déclenché l'évènement et e l'évènement correspondant.
Pour modifier la couleur il faut ajouter dans la procédure:
Select Case sender
Case CouleurRouge
. . .
End Select
|
ou
If sender Is CouleurRouge Then . . .
|
Pour savoir quel controle à déclenché l'évènement commun, on peut aussi mettre dans la propriété 'Tag' de chaque controle un numéro (1, 2, 3...) et tester quel numéro est dans le Tag.
Private Sub Buttons_Click (ByVal sender As System. Object , ByVal e As System. EventArgs ) _
Handles Button1. Click , Button2. Click , Button3. Click
Dim b As String = CType (CType (sender, Button). Tag , String )
Select Case b
Case " 1 "
Case " 2 "
End Select
End Sub
|
VIII-J-6-b. Comment travailler sur plusieurs contrôles ?
Si j'ai une interface utilisateur avec 20 Textbox, comment modifier la couleur de fond des 20 Textbox?
(En VB6 on créait un groupe de contrôle, cela n'existe plus en VB.net!! on l'a dit!!)
Solution 1
TextBox1. BackColor = Color. Red
TextBox2. BackColor = Color. Red
TextBox3. BackColor = Color. Red
. . . . . !!!!!!Bof
|
Solution 2
Mettre les 20 TextBox dans un Panel (invisible); la collection Controls du Panel contient tous les contrôles contenus dans le panel, on utilise cette collection pour atteindre tous les textbox:
Dim i As Integer
For i= 0 to Panel1. Controls . Count
Panel1. Controls (i). BackColor = Color. Red
Next
|
Ici il faut que des TextBox dans le Panel, ce qui n'est pas toujours le cas.
Autre solution s'il n'y a que des TextBox:
For Each TB As TextBox in Panel1. Controls
TB. BackColor = Color. Red
Next
|
S'il n'y a pas que des TextBox dans le Panel et qu'on ne veut modifier que les TextBox:
For Each TB As Control in Panel1. Controls
If TypeOf (TB)= TextBox then
TB. BackColor = Color. Red
End if
Next
|
Solution 3
Mettre les 20 TextBox dans un tableau:
Dim Textes (8) As Object
Textes (1) = TextBox1
Textes (2) = TextBox2
Dim i As Integer
For i = 1 To 2
Dim MyTexte As String = CType (Textes (i), TextBox). Text
Next
|
Comme c'est un tableau d'Object, pour utiliser la propriété 'Text', on est obligé de caster (convertir) l'élément du tableau en TextBox avant d'utiliser la propriété 'Text'.
C'est plus rusé d'utiliser un tableau de TextBox.
< / paragraph>
Dim Textes (8) As TextBox
Textes (0) = TextBox0
Textes (1) = TextBox1
Textes (2) = TextBox2
. . .
Dim i As integer
For i = 0 To 8
Dim MyTexte As Integer= Textes (i). Text
. .
Next
|
Noter qu'on a crée un tableau de TexBox; pas besoin de convertir.
VIII-K. Dimensions, position des contrôles
On peut dimensionner et positionner les contrôles et formulaires:
En mode conception.
Mais aussi avec du code.
Tous les contrôles héritent donc tous de la classe Windows.Forms.Control.
Les contrôles et formulaires ont tous des propriétés communes.
VIII-K-1. Unité de mesure
Pixel:
L'unité de mesure est le 'Pixel' = Picture Elément.(plus de twips comme en vb6)
Les coordonnées d'un contrôle se définissent à partir du coin supérieur gauche du conteneur (coin situé sous la barre de tache dans le cas du formulaire).
Noter qu'à partir du coin supérieur gauche, l'axe des X va de gauche à droite, l'axe des Y de haut en bas.
Le Point:
Pour définir une paire de coordonnées on utilise un objet Point ( ou System.Drawing.Point)contenant les coordonnées x et y du point:
Dim P As New Point (12,45)
|
On peut utiliser P.x et P.y pour modifier une coordonnée.
La taille:
Pour définir la taille d'un contrôle on utilise un objet Size ( ou System.Drawing.Size)contenant 2 integers indiquant habituellement largeur et hauteur:
Dim S As New Size (12,45)
Button1. Size = S
|
Parfois, on a besoin de définir une serie de 4 chiffres (comme par exemple les 4 marges d'un contrôle) dans ce cas on utilise le type Padding:
Button1. Padding = New Padding (30, 10, 10, 10)
Button1. Margin = New Padding (30, 3, 30, 30)
|
Enfin il existe Rectangle, qui contient les coordonnées d'un rectangle (Top, Left, Right, Bottom ou Size, Location) et les méthodes Containts(Point), Inflate (agrandir), Intersects(de 2 rectangles), Offset(déplacement), Union (de 2 rectangles).
Dim r As New Rectangle (10, 10, 20, 20)
|
VIII-K-2. Position initiale dans l'écran d'un formulaire
On peut définir la position initiale, sur l'écran, d'un formulaire grâce à la propriété 'StartPosition':
Le formulaire peut apparaître au centre de l'écran (CenterScreen), au centre du parent (CenterParent) ou à des coordonnées précises (Manual).
De plus la propriété WindowState permet de définir la taille du formulaire: normal, plein écran (Maximized) ou réduit dans la barre de tache (Minimized).
VIII-K-3. Taille et position d'un formulaire ou d'un contrôle
On peut utiliser simplement:
Left, Top coordonnées du coin supérieur gauche et Bottom, Right inférieur droit.
Height, Width pour la hauteur et la largeur du contrôle en pixels.
On peut utiliser aussi:
Size : hauteur, largeur.
Location: coordonnées X,Y du coin supérieur gauche du contrôle en pixels.
SetBounds : coordonnées X,Y , largeur, hauteur.
Voyons cela en détails.
Position du contrôle:
Button. left = 188
Button. Top = 300
|
Ou
Button. Location = New System. Drawing . Point (188,300)
|
Point() contient les coordonnées d'un point dans l'espace.
On remarque qu'il faut donner à la propriété Location un objet Point et non les coordonnées brutes.(En effet, Form1.Location =100, 100 n'est pas accepté)
Form1. Location = New Point (100, 100) est équivalent à:
Form1. left = 100: Form1. Top = 100
|
Pour définir la taille:
Me. Size = New Size (150,150)
Me. Top = 150
|
On créer un objet Size que l'on affecte à la propriété size du contrôle.
On peut aussi donner la position et les dimensions du contrôle en une fois:
Exemple pour le formulaire courant (Me):
Me. SetBounds (12, 15, 100, 100)
Form1. DesktopLocation = new Point (100,100)
|
 |
En mode conception il est bien plus simple de dimensionner les contrôles à la main dans la fenêtre Design.
|
On peut aussi modifier les valeurs des propriétés dans la fenêtre de propriété, mais en VB 2008, sont uniquement visibles dans la fenêtre des propriétés: Location et Size.
En conclusion, les contrôles sont positionnées en coordonnées absolues dans le formulaire. S'ils sont dans un contrôle parent (un GroupBox ou un Panel par exemple) les coordonnées se feront par rapport au contrôle parent.
VIII-K-4. Redimensionnement de fenêtre par l'utilisateur
Pour que l'utilisateur puisse redimensionner la fenêtre(en cliquant sur les bords) il faut que la propriété FormBorderStyle de la fenêtre soit Sizable. (FixedSingle interdit le re-dimensionnement)
ControlBox permet d'afficher la boite de contrôles( bouton d'agrandissement, réduction, fermeture du formulaire) en haut à droite de la barre de tache.
MaximizedBox et MinimizedBox permettent d'utiliser les boutons d'agrandissement ou de réduction du formulaire.
Exemple d'un formulaire ayant:
ControlBox = True
MinimizedBox = True
MaximizedBox = True
FormBorderStyle= Sizable
|
(les bords de la fenêtre ont 2 traits, ce qui permet le redimensionnement).
Après que l'utilisateur ai modifié les dimensions du formulaire, on peut intervenir sur les dimensions du formulaire, pour cela on utilise l'évènement Form.Resize qui est déclenché quand les dimensions du formulaire sont modifiées par l'utilisateur: dans Form.Resize on peut intervenir sur les dimensions du formulaire ou des contrôles:
Exemple: permettre à l'utilisateur de modifier la hauteur mais imposer une largeur de formulaire de 200 pixels.
Private Sub Form1_Resize ()
Me. Width = 200
End Sub
|
Noter que dans Form.Resize on peut récupérer les dimensions du formulaire avec Me.
Les propriétés MaximmunSize et MinimunSize imposent les dimensions maximales et minimales d'un formulaire ou d'un contrôle, ce qui permet de se passer du code qui précède.
Mais si l'utilisateur modifie la taille du formulaire qui contient les contrôles, la taille des contrôles ne suit pas.
Avant VB.net, il fallait dans l'événement Form_Resize, déclenché par la modification des dimensions de la fenêtre, écrire du code modifiant les dimensions et positions des contrôles afin qu'ils s'adaptent à la nouvelle fenêtre:
Exemple: La largeur d'une TextBox se modifie en fonction de la dimension du formulaire.
Private Sub Form1_Resize ()
TextBox. Width = Me. Width - 50
End Sub
|
En VB.Net c'est plus facile avec Dock et Anchor qui 'fixent' le contrôle au conteneur (voir plus bas).
VIII-K-5. Déplacement
Form1. Left + = 200
For i As Integer = 0 to 100
Button1. Left = i
Next i
|
VIII-K-6. Coordonnées souris
Certains évènements relatif à la souris comme MouseDown (appuyer sur le bouton) MouveUp (relâcher le bouton), MouseMove (déplacer le bouton) ont comme paramètre e qui contient les coordonnées souris, elles sont dans e.X et e.Y, ce sont bien les coordonnées DANS le contrôle (coordonnées 'client').
Private Sub ListBox2_MouseDown (ByVal sender As Object, ByVal e As System. Windows . Forms . DragEventArgs ) _
Handles ListBox2. MouseDown
End Sub
|
Mais attention, dans les évènements relatifs au Drag and Drop (DragOver par exemple) ce sont les coordonnées écran. Si je veux avoir des coordonnées relatives à l'objet graphique en cours, il faut les transformer à l'aide de PointToClient qui transforme un point écran en point client:
Exemple: La souris survole ListBox2 , on a e.X et e.Y, coordonnées de l'écran, comment obtenir le Point par rapport à la ListView1?
On transforme e.X et e.Y en coordonnées client (par rapport à la listBox).
(e.Button retourne le bouton utilisé)
Private Sub ListBox2_DragOver (ByVal sender As Object, ByVal e As System. Windows . Forms . DragEventArgs ) _
Handles ListBox2. DragOver
MonImage. Location = ListBox2. PointToClient (New Point (e. X , e. Y ))
|
En plus ListBox2.IndexFromPoint(ListBox2.PointToClient(New Point(e.X, e.Y)) retourne l'index survolé.
PointToScreen fait l'inverse (coordonnées listbox=> coordonnés écran).
VIII-K-7. Anchor
Permet d'ancrer les bords. Un bord ancré reste à égale distance du bord du conteneur quand le conteneur (la fenêtre habituellement) est redimensionné.
En mode conception il suffit de cliquer sur '. . .' en face de Anchor pour voir s'ouvrir une fenêtre, cliquer sur les bords que vous voulez ancrer.
Par défaut les bords Top (haut) et left(gauche) sont ancrés.
Expliquons !!
Left est ancré, si je déplace le bord droit de la fenêtre, le contrôle n'est pas déplacé car la distance bord gauche de la fenêtre et bord gauche du contrôle est fixe. Par contre si je déplace le bord gauche de la fenêtre, le contrôle suit (ce qui parrait évident!!!).
Exemple :
Prenons 2 contrôles dans une fenêtre, celui de gauche a Anchor =left et celui de droite à Anchor =left et right.
Si je déplace le bord droit (ou le gauche d'ailleurs): le contrôle droit est redimensionné car la distance 'bord gauche du conteneur-bord gauche du contrôle droit' est fixe., les 2 contrôles restent côte à côte.
VIII-K-8. Dock
Amarre aux bords. La bordure spécifiée est ancrée directement au conteneur.
Exemple: le contrôle de droite est Dock=Right (Anchor=None)
Le bord droit du contrôle est accroché au bord droit du conteneur. Le contrôle droit est déplacé sans être redimensionné..
Il y a même possibilité d'amarrer aux 4 bords (Dock=Fill) pour remplir le conteneur, et de modifier la propriété DockPaddind du formulaire afin se s'éloigner légèrement des bords pour faire joli.
VIII-K-9. Spliter
Le contrôle Splitter sert à redimensionner des contrôles au moment de l'exécution par l'utilisateur.
Le contrôle Splitter est utilisé dans les applications dont les contrôles présentent des données de longueurs variables, comme l'Explorateur Windows.
Pour permettre à un utilisateur de redimensionner un contrôle ancré au moment de l'exécution, ancrer le contrôle à redimensionner au bord d'un conteneur, puis ancrez un contrôle Splitter sur le même côté de ce conteneur.
En VB.Net 2005 il existe aussi SplitContainer qui est plus pratique que Spliter et LayoutPanel voir 3-9
Les sources présentés sur cette page sont libres de droits,
et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © .
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
Cette page est déposée à la SACD.
|