Cours VB.NET

Image non disponible


précédentsommairesuivant

VIII-H. Les 'Listes'

Image non disponible

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.

Image non disponible

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:

 
Sélectionnez

'Ajout d'un tableau
Dim t() As String {"Franc", "Norgege", Thaïlande" }
Me.ListBox1.Items.AddRange(t)

'ou
 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

 
Sélectionnez

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 ?

 
Sélectionnez

' 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")
 

VIII-H-1-f. Comment lire l'élément 3 ?

 
Sélectionnez

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 ?

 
Sélectionnez

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. 

VIII-H-1-h. Comment sélectionner un élément par code ?

 
Sélectionnez

ListBox1.SetSelected(x, True) 'la ligne contenant x devient bleue

VIII-H-1-i. L'utilisateur double-clique sur l'un des éléments, comment récupérer son numéro ?

Grâce à SelectedIndex.

 
Sélectionnez

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

 
Sélectionnez

Dim LaList() As String = {"one", "two", "three"}
ListBox1.DataSource = LaList

On peut aussi utiliser AddRange:

 
Sélectionnez

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.

 
Sélectionnez

 'En tête de module.
 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

 
Sélectionnez

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) ?

 
Sélectionnez

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.)

 
Sélectionnez

Dim pos As Integer

ReDim ListBox1.Tag(100)  'Création du tableau dans le Tag

 

pos = ListBox1.Items.Add("Utilisateur1") 'On ajoute le nom de l'utilisateur1, 
'pos est l'index de l'élément ajouté

ListBox1.Tag(pos) = 1  'On ajoute dans le Tag  le numéro de l'utilisateur

pos = ListBox1.Items.Add("Utilisateur2")

ListBox1.Tag(pos) = 2

pos = ListBox1.Items.Add("Utilisateur3")

ListBox1.Tag(pos) = 3

 

'Quand l'utilisateur double-clique dans la liste, on récupère le numéro correspondant

Private Sub ListBox1_DoubleClick()

    MsgBox(ListBox1.Tag(ListBox1.SelectedIndex))

End Sub

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

-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.

 
Sélectionnez

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

'On récupère l'Id quand on double clique sur une ligne de la ListBox

    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é.

 
Sélectionnez

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..

 
Sélectionnez

 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

        ' Position et dimension.
        ListBox1.Location = New Point(20, 20)
        ListBox1.Size = New Size(240, 150)

        ' Ajout de 6 items avec AddRange
        Me.ListBox1.Items.AddRange(New Object() _
            {"France", "Norvege", "Thaïlande", _
            "Australie", "Italie", "Espagne"})

        ' Pas de scrollbar.
        ListBox1.ScrollAlwaysVisible = False

        ' Mettre un bord.
        ListBox1.BorderStyle = BorderStyle.Fixed3D

        ' Mettre la propriété DrawMode = OwnerDrawVariable . 
        ' On devra écrire le code des Sub MeasureItem et DrawItem 
        ListBox1.DrawMode = DrawMode.OwnerDrawVariable
        'On ajoute le controle au formulaire
        Me.Controls.Add(Me.ListBox1)
    End Sub


    ' La Sub DrawItem affiche un Item
    Private Sub ListBox1_DrawItem(ByVal sender As Object, _
        ByVal e As DrawItemEventArgs) Handles ListBox1.DrawItem

        ' L' item est celui 'selected' si And sur 'State' et 'DrawItemState.Selected'= true. 
        If (e.State And DrawItemState.Selected = DrawItemState.Selected) Then
            e.Graphics.FillRectangle(Brushes.CornflowerBlue, e.Bounds) ' remplir en bleue
            e.Graphics.DrawString(Me.ListBox1.Items(e.Index), New Font(Me.Font, FontStyle.Bold), _
            Brushes.Black, e.Bounds.X, e.Bounds.Y) 'Afficher le texte et le mettre en gras 
        Else
            ' Si non selected mettre en beige et pas en gras.
            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

        ' Rectangle bleue autour de chaque Item.
        e.Graphics.DrawRectangle(Pens.Blue, New Rectangle(e.Bounds.X, e.Bounds.Y, e.Bounds.Width - 1, e.Bounds.Height))
        'On diminue la largeur du rectangle de 1 pixel, sinon le coté droit n'est pas visible
        
        ' Afficher le focus rectangle .
        e.DrawFocusRectangle()
    End Sub

    ' Sub MeasureItem.
    Private Sub ListBox1_MeasureItem(ByVal sender As Object, _
        ByVal e As MeasureItemEventArgs) Handles ListBox1.MeasureItem

        'Hauteur des items
        'On pourrait modifier la hauteur de chque Item en fonction de ce qu'il contient
        e.ItemHeight = 20
       
    End Sub


End Class
Image non disponible

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.

Image non disponible

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 ».

 
Sélectionnez

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.

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.

Image non disponible

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é.

 
Sélectionnez

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.

 
Sélectionnez

 'En tête de module.
Enum Nom
  Pierre
  Paul
  Jean
End Enum
 
 
 
 Combo1.DataSource = [Enum].GetValues(GetType(TypeFichier))

On peut aussi charger un tableau:

 
Sélectionnez

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:

 
Sélectionnez

	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:

 
Sélectionnez

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:

 
Sélectionnez

 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.

 
Sélectionnez

 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.

 
Sélectionnez

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

    ListView1.Items.Add(LVI)                 'ajout de la ligne

 Next i

Autre manière: ajouter la ligne ' 2 4 8'

 
Sélectionnez

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)
 
 
 'Autre syntaxe
 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.

 
Sélectionnez

 'Le ListView1 existe
 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)
Image non disponible

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:

 
Sélectionnez

 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:

 
Sélectionnez

ListView1.Items(1).SubItems(1).Text = "88"

De même pour les couleurs:

 
Sélectionnez

'Mettre le fond d'une case en rouge
ListView1.Items(2).UseItemStyleForSubItems= False
ListView1.Items(2).SubItem (3).BackColor= Colors.Red

'Mettre une ligne en vert
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)?

 
Sélectionnez

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 :

 
Sélectionnez

ListView1.SelectedItems(0)

Comment effacer la ligne selectionnée:

 
Sélectionnez

ListView1.Items.RemoveAt (ListView1.SelectedIndices(0))
'ou
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:

Image non disponible

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):

 
Sélectionnez

With 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 
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:

 
Sélectionnez

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:

Image non disponible

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é.

 
Sélectionnez

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.

Image non disponible

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).

 
Sélectionnez

MyTree.Nodes(10).Children 'retourne le nombre d'enfant

Pour voir les enfants il y a plusieurs méthodes:

 
Sélectionnez

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:

 
Sélectionnez

MyTree.Nodes(7).Image = "closed" 
 

Nombre de noeuds:

 
Sélectionnez

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 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.

 
Sélectionnez

MyTree.Nodes.Add("Lucienne")

On peut ajouter un noeud sous le noeud sélectionné.

 
Sélectionnez

MyTree.SelectedNode.Nodes.Add("toto")

ou en développant:

 
Sélectionnez

Dim node As System.Windows.Forms.TreeNode
node = MyTree.SelectedNode
node.Nodes.Add("Nouveau noeud sous la sélection")
 

On peut enlever un noeud:

 
Sélectionnez

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

 
Sélectionnez

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:

 
Sélectionnez

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)

 
Sélectionnez

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 

Exemple plus simple:

 
Sélectionnez

        'Il existe un controle Treview1 dans le formulair
        
        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.

 
Sélectionnez

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.

 
Sélectionnez

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...)

Image non disponible

Il existe :

-Les MessageBox et MsgBox.

-Les InputBox

et les autres

...

Image non disponible

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:

 
Sélectionnez

MessageBox.show(TexteAAfficher) ' Affiche une box avec le message et un bouton 'Ok', 
'pas de valeur de retour.

ou

 
Sélectionnez


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:

Image non disponible

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:

Image non disponible

Icons

-le style d'icône à utiliser:

MessageBoxIcon.Error

MessageBoxIcon.Exclamation

...

Image non disponible

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é.

 
Sélectionnez

DialogResult.Yes

DialogResult.No

DialogResult.Cancel

DialogResult.Retry

DialogResult.Ok

Exemple 1:

Afficher un simple message:

 
Sélectionnez

 MessageBox.Show("bonjour")

Affiche Image non disponible

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:

 
Sélectionnez

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:

Image non disponible

Ecriture plus compact:

 
Sélectionnez

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.

 
Sélectionnez

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:

Image non disponible

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':

 
Sélectionnez

If MsgBox("D'accord?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then

End If

Exemple complet :

 
Sélectionnez

Dim msg As String

Dim title As String

Dim style As MsgBoxStyle

Dim response As MsgBoxResult

msg = "Voulez vous continuer?"               ' Définition du message à afficher.

style = MsgBoxStyle.DefaultButton2 Or _

   MsgBoxStyle.Critical Or MsgBoxStyle.YesNo 'On affiche Oui Non

title = "MsgBox Démonstration"               ' Définition du  titre.

' Affiche la boite MsgBox.

 

response = MsgBox(msg, style, title)

 

If response = MsgBoxResult.Yes Then   

   ' code si l'utilisateur a cliqué sur Oui

Else

   ' code si l'utilisateur a cliqué sur Non.

End If

Voila ce que cela donne:

Image non disponible

'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:

 
Sélectionnez

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.

 
Sélectionnez

Dim Nom As String

Nom = InputBox("Bonjour","Tapez votre nom ?")

Cela donne :

Image non disponible

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:

 
Sélectionnez

Dim reponse As String 'on crée une variable qui contiendra la chaîne tapée par l'utilisateur.

Do

    reponse= InputBox("Tapez un nom") 'saisir une chaîne de caractères dans une InputBox

Loop Until String.IsNullOrEmpty(reponse)'si l'utilisateur n'a rien tapé, on boucle et on réaffiche l'inputbox

 

reponse=reponse.Trim(" ")    'enlève les espaces avant et après

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 :

 
Sélectionnez

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:

Image non disponible

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 :

 
Sélectionnez

 With OpenFileDialog1

    .Title= "Ouvrir"        'Titre de la barre de titre

    .InitialDirectory = "c:\"   'répertoire de départ        

    .Filter="Fichiers txt|*.txt" ' on travaille uniquement sur les .txt

                              's'il y a plusieurs filtres les séparer par ;  

                                FilterIndex  indique le filtre en cours

    .Multiselect=False        'sélectionner 1 seul fichier

    .CheckFileExists=True     'Message  si nom de fichier qui n'existe pas.

                              'Permet d'ouvrir uniquement un fichier qui existe; CheckPathExists peut aussi être utilisé. 

    .ValidateNames=True        'n'accepte que les noms valides (win 32)

    .AddExtension=True        'ajoute une extension au nom s'il n'y en a pas

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:

 
Sélectionnez

DialogResult.Ok    'si l'utilisateur a cliqué sur 'Ouvrir'

DialogResult.Cancel   'si l'utilisateur a cliqué sur 'Annuler'

Comment utiliser cela?

 
Sélectionnez

If OpenFileDialog1.ShowDialog= DialogResult.Ok Then  'L'utilisateur a bien cliqué sur ok

End if  

Maintenant, OpenFileDialog1.FileName contient le nom du fichier sélectionné (avec extension et chemin).

 
Sélectionnez

Path.GetFileName(OpenFileDialog1.FileName) 'donne le nom du fichier sans chemin.

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.

 
Sélectionnez

SaveFileDialo1.CreatePrompt= True    ' Message de confirmation si

                                     'création d'un nouveau fichier

SaveFileDialo1.OverwritePrompt=True  'Message si le fichier existe déjà

                                     'évite l'effacement d'anciennes données

SaveFileDialo1.DefaultExt="txt"      'extension par défaut

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 .

 
Sélectionnez


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()
Image non disponible

VIII-I-7. FontDialog

Pour que l'utilisateur choisisse une police de caractère et modifie la police d'un contrôle List1.

 
Sélectionnez

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:

Image non disponible

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

Image non disponible

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.

 
Sélectionnez

Private Sub CouleurButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) _

Handles CouleurButton.Click

' Ouverture de la dialogBox colordialog1

If colorDialog1.ShowDialog() = DialogResult.OK Then

' on met la couleur dans la propriété forecolor du TextBox

Texte.ForeColor = colorDialog1.Color

End If

End Sub

On peut modifier la boite à notre gout avant de l'ouvrir:

 
Sélectionnez

colorDialog1.SolidColorOnly= True  'Couleurs pures (unies) seulement
colorDialog1.AllowFullOpen= True  'Autorise le bouton des couleurs personnalisées (volet de droite)
colorDialog1.FullOpen= True  'Affiche les couleurs personnalisées
colorDialog1.Color= Color.Red  'Couleur préselectionnée

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:

 
Sélectionnez

 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:

 
Sélectionnez

 Dim f2 As New Form2
        Dim Dia As DialogResult = f2.ShowDialog
        MsgBox(Dia.ToString) 'Affiche 'Ok'

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':

Image non disponible

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:

 
Sélectionnez

'On ouvre le formulaire Dialog1
Dialog1.ShowDialog()

If Dialog1.DialogResult= DialogResult.Ok then

    'l'utilisateur a cliqué sur le bouton ok

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.

Image non disponible

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.

Image non disponible

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.

Image non disponible

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.

Image non disponible

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:

Image non disponible

TableLayoutPanel:On crée un tableau de panel, puis on met les contrôles dans les cellules:

Image non disponible

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:

 
Sélectionnez

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.

 
Sélectionnez

Sub Texte_Click (Index)

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:

 
Sélectionnez

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:

 
Sélectionnez

Select Case sender

    Case CouleurRouge
    ...
End Select

ou

 
Sélectionnez

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.

 
Sélectionnez

 Private Sub Buttons_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
 Handles Button1.Click, Button2.Click, Button3.Click
        'sender et Tag sont des objets, il faut les transformer en Button et String
        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

 
Sélectionnez

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:

 
Sélectionnez

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:

 
Sélectionnez

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:

 
Sélectionnez

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:

 
Sélectionnez

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.

 
Sélectionnez

					</paragraph>
Dim Textes(8) As TextBox           
  
'puis dans le form_load
Textes(0) = TextBox0
Textes(1) = TextBox1
Textes(2) = TextBox2
... 
'ensuite, on peut bien utiliser la syntaxe de VB 6.0

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

Image non disponible

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.

Image non disponible

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:

 
Sélectionnez

Dim P As New Point(12,45)    'Ici 12 et 45 sont les coordonnées X et Y du point.

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:

 
Sélectionnez

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:

 
Sélectionnez

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).

 
Sélectionnez

 Dim r As New Rectangle(10, 10, 20, 20)
' x, y, Width, Height

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).

Image non disponible

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.

Image non disponible

Voyons cela en détails.
Position du contrôle:

 
Sélectionnez

Button.left=188

Button.Top =300

Ou

 
Sélectionnez

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é)

 
Sélectionnez

Form1.Location = New Point(100, 100) est équivalent à:

Form1.left=100: Form1.Top=100

Pour définir la taille:

 
Sélectionnez

Me.Size= New Size(150,150)
'ou
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):

 
Sélectionnez

Me.SetBounds (12, 15, 100, 100)    'X,Y, Width, Height.

Form1.DesktopLocation = new Point(100,100) 'Ici on donne les coordonnées par rapport à la barre de tache.

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:

 
Sélectionnez

ControlBox =True
MinimizedBox =True
MaximizedBox =True
FormBorderStyle= Sizable 

(les bords de la fenêtre ont 2 traits, ce qui permet le redimensionnement).

Image non disponible

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.

 
Sélectionnez

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.

 
Sélectionnez

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

 
Sélectionnez

Form1.Left += 200    'déplace le formulaire de 200 pixels

 

'déplacement progressif d'un bouton de gauche à droite:

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').

 
Sélectionnez

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é)

 
Sélectionnez

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.

Image non disponible
Image non disponible

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)

Image non disponible
Image non disponible

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


précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. 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'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.