FAQ VB.NETConsultez toutes les FAQ

Nombre d'auteurs : 36, nombre de questions : 239, dernière mise à jour : 24 mai 2015  Ajouter une question

 

Cette FAQ a été réalisée pour répondre aux questions les plus fréquemment posées sur le forum Développement DotNET

Je tiens à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle contient sont correctes. Les auteurs font le maximum, mais l'erreur est humaine. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, lisez ceci.

Sur ce, je vous souhaite une bonne lecture.


SommaireWinForms (59)
précédent sommaire suivant
 

On peut donner le style Windows XP à son application de deux manières différentes selon que l'on utilise le framework.NET 1.0
ou le Framework.NET 1.1
Avec le Framework 1.0, il faut procéder ainsi :

  • Créer un fichier nommé WindowsApplication1.exe.manifest à l'aide d'un éditeur de texte (WindowsApplication1 étant
    le nom de votre application) ;
  • Y copier le texte suivant et le sauvegarder dans le répertoire où se trouve l'exécutable de votre application.


Code xml : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="Microsoft.Winweb.MantaRay" type="win32" /> 
    <description>.NET control deployment tool</description> 
    <dependency> 
        <dependentAssembly> 
            <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" 
              publicKeyToken="6595b64144ccf1df" language="*" /> 
        </dependentAssembly> 
    </dependency> 
</assembly>
Avec le Framework 1.1 il faut procéder ainsi :
  • Ajouter un appel à Application.EnableVisualStyles dans votre code avant la création de tout contrôle ;
  • Mettre la propriété Flat de tous les contrôles Winform qui en possèdent une à System.


Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
'Soit dans le constructeur de la form principale de votre projet 
Public Sub New() 
    MyBase.New() 
    'Style Win XP 
    Application.EnableVisualStyles() 
    'Cet appel est requis par le Concepteur Windows Form. 
    InitializeComponent() 
    'Ajoutez une initialisation quelconque après l'appel InitializeComponent() 
End Sub 
  
' Soit dans la fonction  Main de démarrage de votre projet 
Shared Sub Main() 
    'Style Win XP 
    Application.EnableVisualStyles() 
    Application.Run(New Form1) 
End Sub

Mis à jour le 30 novembre 2013 abelman keita

Lors de la réalisation d'applications, il peut être utile de montrer à l'utilisateur que le traitement demandé est en cours (et qu'il faut patienter).
Un bon moyen de réaliser ceci est de changer la forme du curseur, pendant la durée du traitement.
Pour ce faire, vous devez utiliser la Classe Cursors.

Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
'Fonction du code d'un bouton de notre Form 
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ 
    Handles Button1.Click 
    ' On passe le curseur en sablier 
    Cursor = Cursors.WaitCursor 
  
    ' On affiche une boîte de dialogue 
    MessageBox.Show("Le curseur est maintenant un sablier") 
  
    ' On repasse le curseur en normal 
    Cursor = Cursors.Arrow 
End Sub
N'hésitez pas à vous reporter à la classe Cursors pour voir les types de curseur disponibles et utilisables par votre application.

Mis à jour le 30 novembre 2013 abelman

On utilise le composant FolderBrowserDialog pour cela.

Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
  
    FolderBrowserDialog1.Description = "Choisissez votre répertoire" 
    If FolderBrowserDialog1.ShowDialog(Me) = DialogResult.OK Then 
        MessageBox.Show(Me, _ 
        "Vous avez choisi " + FolderBrowserDialog1.SelectedPath, _ 
        "Repertoire", _ 
        MessageBoxButtons.OK, _ 
        MessageBoxIcon.Information) 
    End If 
  
End Sub

Mis à jour le 29 octobre 2013 abelman

Le composant System.Windows.Form.OpenFileDialog permet à l'utilisateur de choisir interactivement un fichier afin d'y lire des données.
Créez une form et placez-y un bouton nommé button2, un composant RichTextBox nommé richTextBox1 et un composant OpenFileDialog nommé openFileDialog1
Un clic sur le bouton2 permet de lire le fichier choisi et d'afficher son contenu dans le RichTextBox

Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Private Sub Button2_Click1(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click 
  
    'Titre 
    OpenFileDialog1.Title = "Chargement" 
    'Extension par défaut 
    OpenFileDialog1.DefaultExt = "txt" 
    'Filtres 
    OpenFileDialog1.Filter = "fichiers textes (*.txt)|*.txt|Tous les fichiers (*.*)|*.*" 
    OpenFileDialog1.FilterIndex = 1 
    'Ouverture boite de dialogue OpenFile 
    If OpenFileDialog1.ShowDialog(Me) = DialogResult.OK Then 
        'On vide le TextBox 
        RichTextBox1.Text = String.Empty 
        'Ouverture du fichier sélectionné 
        'son nom est dans openFileDialog1.FileName 
        Dim sr As StreamReader = New StreamReader(OpenFileDialog1.OpenFile, Encoding.Default) 
        Try 
            Dim data As String = sr.ReadLine 
            While Not (data Is Nothing) 
                RichTextBox1.AppendText(data + _ 
                Convert.ToChar(13) + _ 
                Convert.ToChar(10)) 
                data = sr.ReadLine() 
            End While 
        Finally 
            If Not (sr Is Nothing) Then 
                sr.Close() 
            End If 
        End Try 
    End If 
  
End Sub

Mis à jour le 29 octobre 2013 abelman

Le composant System.Windows.Form.SaveFileDialog permet à l'utilisateur de choisir interactivement un fichier afin d'y écrire des données.
Créez une form et placez-y un bouton nommé button1, un composant RichTextBox nommé richTextBox1 et un composant SaveFileDialog nommé saveFileDialog1.
Un clic sur le bouton1 permet de sauvegarder le contenu du RichTextBox vers le fichier choisi.

Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click 
  
    If MessageBox.Show(Me, _ 
        "Sauvegarder le document?", _ 
        "Sauvegarde", _ 
        MessageBoxButtons.YesNo, _ 
        MessageBoxIcon.Question) = DialogResult.No Then 
        Return 
    End If 
  
    'Titre 
    SaveFileDialog1.Title = "Sauvegarde" 
    'Extension par défaut 
    SaveFileDialog1.DefaultExt = "txt" 
    'Filtres 
    SaveFileDialog1.Filter = "fichiers textes (*.txt)|*.txt|Tous les fichiers (*.*)|*.*" 
    SaveFileDialog1.FilterIndex = 1 
    'Ouverture boîte de dialogue saveFile 
    If SaveFileDialog1.ShowDialog(Me) = DialogResult.OK Then 
  
        Dim sw As StreamWriter = New StreamWriter(SaveFileDialog1.OpenFile, Encoding.Default) 
        Try 
            Dim i As Integer = 0 
            While i < RichTextBox1.Lines.Length 
                sw.WriteLine(RichTextBox1.Lines(i)) 
                System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1) 
            End While 
        Finally 
            If Not (sw Is Nothing) Then 
                sw.Close() 
            End If 
        End Try 
  
    End If 
  
End Sub

Mis à jour le 29 octobre 2013 abelman

Dans le constructeur, il suffit d'ajouter

Code vb.net : Sélectionner tout
1
2
Me.SetStyle(ControlStyles.SupportsTransparentBackColor, True) 
Me.BackColor = Color.Transparent
après le InitializeComponents().

Mis à jour le 29 octobre 2013 Ditch

Il faut pour cela insérer ce petit bout de code dans notre classe, ce qui permet de détecter une tentative de fermeture de session et de l'annuler :

Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
' Message Windows QueryEndSession 
Private Const WM_QUERYENDSESSION As Integer = &H11 
  
' flag indiquant si la session est en cours de fermeture 
Private _systemShutdown As Boolean = False 
  
  
' Redéfinition de la fonction virtuelle WndProc 
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) 
  
    ' Mise dans systemShutdown la présence du message fermeture Windows 
    If m.Msg = WM_QUERYENDSESSION Then 
        _systemShutdown = True 
    End If 
    MyBase.WndProc(m) 
End Sub 
  
' Handler evenement closing 
Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing 
    ' Si le message fermeture Windows a été envoyé, on l'annule ! 
    If _systemShutdown Then 
        e.Cancel = True 
        _systemShutdown = False 
        MessageBox.Show("Fermeture de session windows annulée") 
    End If 
  
End Sub

Mis à jour le 29 octobre 2013 abelman

Parfois, nous avons besoin de distinguer si la fenêtre de l'application a été fermée par un clic sur un contrôle prévu à cet effet, ou si le clic a été effectué sur la petite croix en haut à droite de la fenêtre.
Pour ce faire, nous avons juste besoin de savoir que l'évènement concerné est lié à l'Application et non au contrôle Form.

Voici un exemple de code test, qui vous démontrera que seule la fermeture intempestive de l'application déclenchera le MessageBox.

Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
AddHandler Application.ApplicationExit, AddressOf Application_Exit 
' ... 
Private Shared Sub Application_Exit(ByVal sender As Object, ByVal e As System.EventArgs) 
    MessageBox.Show("Adieu vilaine brute") 
End Sub 
  
Private Sub button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) 
    Application.Exit() 
End Sub

Mis à jour le 29 octobre 2013 neguib

Pour changer l'icône de votre application dans Visual Studio, allez dans le menu "Projet", puis :

  • Projet ;
  • Propriéte de "MonApplication" ;
  • Génération ;
  • Icône d'application ;
  • Choisir votre icône.

Mis à jour le 29 octobre 2013 troxsa

Le code ci-dessous permet de détecter si votre application a déjà été lancée une fois. Si tel est le cas un avertissement est affiché.

Code vb.net : Sélectionner tout
1
2
3
Imports System.IO 
Imports System.Management 
Imports System.IO.Path
Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    '============================ 
    '===    Les Variables 
    '============================ 
    Dim Process As New ManagementObjectSearcher("SELECT * FROM Win32_Process") 'Lecture des process 
    Dim info As ManagementObject 
    Dim stock As String 
    Dim vrs As Integer 
  
    '=== Récupération des informations sur l'exe 
    Dim MyNameApp As New FileInfo(Application.ExecutablePath)   ' où ce trouve le programme 
    Dim SingApp As FileVersionInfo = FileVersionInfo.GetVersionInfo(MyNameApp.Name) 'lecture creation name 
  
    For Each info In Process.Get 
        stock = info("Caption").ToString() 
        If stock = SingApp.OriginalFilename.ToString() Then 
            vrs = vrs + 1 
            If vrs > 1 Then 
                MessageBox.Show("L'application '" & MyNameApp.Name & "' deja lancée", MsgBoxStyle.Critical) 
            End 
            End If 
        End If 
    Next 
End Sub
Code vb.net : Sélectionner tout
1
2
3
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    Process.Start(Application.ExecutablePath) 
End Sub

Mis à jour le 29 octobre 2013 troxsa

Pour illustrer cette méthode nous allons prendre un exemple concret.
Imaginons que nous avons une liste d'articles classés par famille et que nous voulions utiliser un ComboBox contenant la liste des familles pour filtrer la liste des articles. Nous voulons également ajouter "<Toutes>" à la liste des familles du ComboBox pour pouvoir annuler le filtre et retrouver la liste complète de nos articles.

Pour commencer nous allons ajouter une class au code de notre WinForm :

Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Public Class ListItem 
  
    Public Value As Object 
    Public Text As String 
  
    Public Sub New(ByVal NewValue As Object, ByVal NewText As String) 
        Value = NewValue 
        Text = NewText 
    End Sub 
  
    Public Overrides Function ToString() As String 
        Return Text 
    End Function 
  
End Class
Maintenant nous allons créer la liste des familles dans notre ComboBox à l'aide d'une table contenant 2 champs (PrimaryKey, Famille) :

Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
Dim myTable as DataTable 
Dim item As DataRow 
  
' **** ici le code pour remplir le DataTable 
  
MyComboBox.Items.Add(New ListItem("0", "<Toutes>")) 
For Each item In myTable.Rows 
    MyComboBox.Items.Add(New ListItem(item("PrimaryKey"), item("Famille"))) 
Next 
MyComboBox.SelectedIndex = 0
Pour récupérer les données de chaque Item il faut procéder de cette façon :

Code vb.net : Sélectionner tout
1
2
3
4
5
Dim myValue as Integer 
Dim myText as String 
  
myValue=CType(myComboBox.SelectedItem, ListItem).Value 
myText=CType(myComboBox.SelectedItem, ListItem).Text
La puissance de cette méthode réside dans le fait que vous pouvez ajouter autant de paramètres que vous voulez dans la class ListItem.

Mis à jour le 29 octobre 2013 Cyrilange

Afin de pouvoir communiquer à partir d'une form nouvellement ouverte vers la form créatrice vous devez passer la form créatrice à la nouvelle form.
Le Button_Click se trouve dans la Form2, alors que le reste TraitementForm1() et OuvertureForm2() se trouve dans la Form1.

Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Public Sub TraitementForm1() 
    ' ... 
End Sub 
  
Public Sub OuvertureForm2() 
    Dim maForm2 As MaForm2 = New MaForm2 
    maForm2.Owner = Me 
    maForm2.Show 
End Sub 
  
Private Sub ButtonOk_Click(ByVal sender As Object, ByVal e As System.EventArgs) 
    Dim maForm1 As MaForm1 = CType(Me.Owner, MaForm1) 
    maForm1.TraitementForm1 
End Sub

Mis à jour le 29 octobre 2013 dev01

Ce code permet de créer 10 contrôles CheckBox, de les ajouter dans une Listbox et de gérer leurs évènements CheckedChanged. Il nécessite la présence d'un contrôle ListBox nommé « ListBox1 » et d'un bouton nommé « BTN ».

Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Private Sub BTNClick(ByVal sender As Object, ByVal e As EventArgs) Handles BTN.Click 
    Dim i As Integer 
    Dim x As CheckBox 
    For i = 1 To 10 
        x = New CheckBox() 
        x.Name = "Macase" & i.ToString() 
        ' on place les CheckBox les unes en dessous des autres 
        x.Left = 10 
        x.Top = i * 20 
        x.Width = 150 
        x.Text = "Je suis la case " &  i.ToString() 
        ' abonner CheckedChanged à la méthode commune MesCasesCheckedChanged 
        AddHandler x.CheckedChanged, AddressOf Me.MesCasesCheckedChanged 
        ' ajouter le checkbox à la ListBox 
        Me.ListBox1.Controls.Add(x) 
    Next 
End Sub 
  
Private Sub MesCasesCheckedChanged(ByVal sender As Object, ByVal e As EventArgs) 
    Dim cbx As CheckBox = CType(sender, CheckBox) 
    MessageBox.Show("L'état de " & cbx.Name & " est " & cbx.Checked.ToString()) 
End Sub

Mis à jour le 29 octobre 2013 HULK

Ce code permet de remplir un DataGrid avec un DataAdapter. Il nécessite un contrôle DataGrid nommé ici « DataGrid1 »

Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Imports System 
Imports System.Data 
Imports System.Data.SqlClient 
Imports System.Windows.Forms 
  
' ... 
Dim con As SqlConnection 
Dim cs As String = " la chaine de connexion SQL" 
Dim da As SqlDataAdapter 
Dim ds As DataSet 
  
con = New SqlConnection(cs) 
  
da = New SqlDataAdapter("SELECT champ1, champ2 FROM table", con) 
' pour avoir des noms différents pour les colonnes du DataGrid 
' utiliser des alias SELECT Champ1 AS NouveauNom 
  
ds = New DataSet("Nom_Dataset") 
  
da.Fill(ds, "Nom_Datatable") 
  
DataGrid1.SetDataBinding(ds, "Nom_Datatable")

Mis à jour le 29 octobre 2013 HULK

Il s'agit d'un contrôle label possédant un ou plusieurs lien(s) hypertexte. L'exemple suivant gère un linklabel exposant deux liens.

Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Dim MonLien As New Windows.Forms.LinkLabel 
    With MonLien 
        .Location = New Point(24, 80) 
        .Size = New Size(320, 16) 
        'Gestion des couleurs de lien 
        .DisabledLinkColor = Color.Gray 
        .VisitedLinkColor = Color.Indigo 
        .LinkColor = Color.Blue 
        'Ajout du texte puis des liens 
        .Text = "Vous trouverez de l'aide sur MSDN ou sur Developpez.com" 
        .Links.Add(29, 4, "www.microsoft.com/france/vbasic/default.mspx") 
        .Links.Add(41, 14, "www.vb.developpez.com") 
    End With 
    Me.Controls.Add(MonLien) 
    AddHandler MonLien.LinkClicked, AddressOf linkLabel_LinkClicked 
  
End Sub 
  
Private Sub linkLabel_LinkClicked(ByVal sender As Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) 
  
    'marque le lien cliqué comme visité 
    CType(sender, LinkLabel).Links(CType(sender, LinkLabel).Links.IndexOf(e.Link)).Visited = True 
    'Récupère la cible du lien cliqué 
    Dim target As String = CType(e.Link.LinkData, String) 
    'Démarre Internet Explorer 
    If Not target Is Nothing AndAlso target.StartsWith("www") Then 
        System.Diagnostics.Process.Start("IExplore.exe", target) 
    End If 
  
End Sub

Mis à jour le 29 octobre 2013 bidou

Ce code permet de réaliser simplement une capture d'écran de la fenêtre active et de l'écran en entier. Le principe est de simuler l'appui sur la touche « Impr écran » puis de récupérer l'image obtenue dans le Presse-Papier. Pour l'exemple donné ci-dessous, les résultats sont affichés dans deux PictureBox : PBWindow, PBScreen après le clic sur un Button BPrint.

Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Sub BPrintClick(sender As System.Object, e As System.EventArgs) 
  
    Dim screen As Bitmap 
    Dim window As Bitmap 
  
    ' simuler l'appui de la touche PrintScreen 
    SendKeys.SendWait("{PRTSC}") 
    ' récupérer l'image obtenue dans le Presse-Papier 
    window = CType(Clipboard.GetDataObject().GetData("Bitmap"), Bitmap) 
    'attribuer l'image à PBWindow 
    PBWindow.Image = window 
    ' simuler le PrintScreen enrichi 
    SendKeys.SendWait("+{PRTSC}") 
    ' récupérer l'image obtenue dans le Presse-Papier 
    screen = CType(Clipboard.GetDataObject().GetData("Bitmap"), Bitmap) 
    'attribuer l'image à PBScreen 
    PBScreen.Image = screen 
End Sub

Mis à jour le 29 octobre 2013 HULK

Pour accéder aux composants graphique d'un formulaire à partir d'un autre thread que celui de la forme vous devez utiliser la fonction invoke des composants.

Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Sub LanceThread(ByVal sender As Object, ByVal e As EventArgs) 
    Dim operation As ThreadStart = AddressOf Fonction1 
    Dim LeThread As Thread = New Thread(operation) 
    LeThread.Start 
End Sub 
  
Private Sub Fonction1() 
    If textBox1.InvokeRequired Then 
        textBox1.Invoke(AddressOf FonctionTextBox) 
    Else 
        FonctionTextBox 
    End If 
End Sub 
  
Private Delegate Sub TextBoxInvokeHandler() 
  
Private Sub FonctionTextBox() 
    textBox1.Text = "dans le thread" 
End Sub
Dans cette exemple nous créons notre propre délégué. Ceci est utile si vous avez des informations particulières à passer à votre fonction.

Mis à jour le 29 octobre 2013 dev01

Il suffit de traiter l'évènement OnClosing du formulaire et de positionner Cancel à true

Code vb.net : Sélectionner tout
1
2
3
Private Sub MainForm_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) 
    e.Cancel = True 
End Sub

Mis à jour le 30 novembre 2013 dev01

L'intérêt est ici de pouvoir modifier le NotifyIcon de notre application, afin par exemple d'y faire apparaître un texte en fonction de différentes circonstances.

L'exemple implémenté se contentera de faire ici défiler dans l'objet notifyIcon1 les secondes d'un objet DateTime. La procédure est assez simple puisqu'il s'agit de travailler via un objet Bitmap pour la modification et de le convertir en Icon à assigner à la propriété notifyIcon1.Icon.

Ce qu'il ne faut absolument pas oublier est de détruire au fur et à mesure les icônes en mémoire.

Le code suivant ne montre que l'essentiel, il vous faut bien sûr en plus déclarer et instancier les objets Font, Brush, Color et StringFormat souhaités

Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
''' <summary> Méthode privée timer1_Tick 
'''     gestionnaire de l'évènement Tick de timer1 
''' </summary> 
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As 
    System.EventArgs) Handles Timer1.Tick 
    ' lancer la mise à jour de NotifyIcon1 
    Me.UpdateNotiFyIcon(DateTime.Now.Second.ToString()) 
End Sub 
  
  
'''<summary> Méthode privée UpdateNotiFyIcon 
'''     chargée de mofifier notifyIcon1 dynamiquement 
'''</summary> 
'''<param name="texte">String : représente le texte à afficher 
'''</param> 
Private Sub UpdateNotiFyIcon(ByVal texte As String) 
    ' redessiner iconBitmap 
    Me.UpdateBitmap(texte) 
    ' récupérer un icone à patir de iconBitmap 
    Dim newIcon As Icon = Drawing.Icon.FromHandle 
    (Me.iconBitmap.GetHicon()) 
    ' assigner le nouvel icône de NotifyIcon1 
    Me.notifyIcon1.Icon = newIcon 
    ' détruire en mémoire newIcon 
    newIcon.Dispose() 
End Sub 
  
  
'''<summary> Méthode privée UpdateBitmap 
'''     chargée de redessiner iconBitmap en fonction d'un texte 
'''</summary> 
'''<param name="texte">String : représente le texte à afficher 
'''</param> 
Private Sub UpdateBitmap(ByVal texte As String) 
    Dim g As Graphics = Graphics.FromImage(Me.iconBitmap) 
    ' assigner la couleur de fond 
    g.Clear(Me.iconBackColor) 
    ' dessiner le texte 
    g.DrawString 
    (texte,Me.iconFont,Me.iconForeBrush,14,14,Me.iconStringFormat) 
    ' liberer l'objet Graphics 
    g.Dispose() 
End Sub

Mis à jour le 29 octobre 2013 neguib

Pour déplacer un contrôle, nous avons besoin de 2 informations :

Le bouton gauche vient-il d'être enfoncé ? La souris se déplace-t-elle en étant au dessus du contrôle ?
Le Framework met justement à notre disposition 2 évènements nous permettant de connaître ces 2 informations :

  • MouseDown : notifie si le bouton de la souris a été enfoncé mais aussi à quel endroit ;
  • MouseMove : notifie si la souris se déplace.


Il suffit donc de traiter le premier évènement afin de connaître la position d'origine du clic et dans le second évènement, nous repositionnerons le contrôle par rapport au déplacement de la souris.

Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
' Position de la souris lorsque le bouton a été enfoncé 
Dim positionClick As Point 
  
' Notifie si le bouton de la souris a été enfoncé sur le contrôle 
Private Sub Control_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown 
    ' Vérification si bouton gauche de la souris est bien enfoncé 
    If (e.Button = MouseButtons.Left) Then 
        positionClick = e.Location 
    End If 
End Sub 
  
' Notifie si le curseur se déplace au dessus du contrôle 
Private Sub Control_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseMove 
    ' Vérification si bouton gauche de la souris est bien enfoncé 
    If (e.Button = MouseButtons.Left) Then 
        Dim currentControl As Control 
        currentControl = CType(sender, Control) 
        ' Calcul de la nouvelle position du contrôle 
        currentControl.Location = New Point(currentControl.Location.X + e.X - positionClick.X, currentControl.Location.Y + e.Y - positionClick.Y) 
    End If 
End Sub
À noter que ce code peut être utilisé pour n'importe quel contrôle permettant d'être notifié pour les évènements MouseDown et MouseMove.

Mis à jour le 29 octobre 2013 Jérôme Lambert

Pour forcer l'évènement Paint, il suffit d'appeler la méthode Invalidate liée à la classe de la fenêtre :

Code vb.net : Sélectionner tout
1
2
' Forcer l'évènement Paint 
Me.Invalidate()
Cependant et pour des raisons de performances, on spécifiera le rectangle à rafraichir :

Code vb.net : Sélectionner tout
1
2
' Forcer l'évènement Paint en spécifiant le rectangle à rafraichir 
Me.Invalidate(new Rectangle(0, 0, 10, 10))

Mis à jour le 29 octobre 2013 Jérôme Lambert

Il suffit tout simplement de mettre à true la propriété TopMost de la fenêtre :

Code vb : Sélectionner tout
1
2
3
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Me.TopMost = True ' Passe la fenêtre en premier plan 
End Sub

Mis à jour le 29 octobre 2013 Aspic Jérôme Lambert

Il n'est pas possible d'écrire le texte d'un label avec plusieurs couleurs par défaut, mais on peut y arriver en créant un nouveau contrôle qui dérive de Label et en surchargeant la méthode OnPaint.

Tout d'abord, créer une classe dérivée de Label et surcharger OnPaint :

Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Public Class MonLabel  
    Inherits System.Windows.Forms.Label  
    Protected Overloads Overrides Sub OnPaint(ByVal e As PaintEventArgs)  
        Dim mesCouleurs As Brush() = {Brushes.Red, Brushes.Orange, Brushes.Green, Brushes.Blue}  
        Dim br As Integer = 0  
        Dim chaine As String = Text  
  
        Dim listString As New List(Of String)()  
        Dim sb As New StringBuilder()  
        For i As Integer = 0 To chaine.Length - 1  
            If chaine(i) = " "C OrElse chaine(i) = "'"C Then  
                If chaine(i) = "'"C Then  
                    sb.Append(chaine(i))  
                End If  
                listString.Add(sb.ToString())  
                sb = New StringBuilder()  
            Else  
                sb.Append(chaine(i))  
            End If  
        Next  
        listString.Add(sb.ToString())  
  
        Dim startX As Single = 0  
        For Each s As String In listString  
            e.Graphics.DrawString(s, Font, mesCouleurs(br), startX, 0)  
            startX += e.Graphics.MeasureString(s, Font).Width  
            br += 1  
            If br >= mesCouleurs.Length Then  
                br = 0  
            End If  
        Next  
        Width = CInt(startX)  
    End Sub  
End Class
Ici, j'ai choisi de changer de couleur à chaque espace trouvé ou à chaque « ' » trouvée. J'utilise DrawString pour écrire la partie de mot avec la couleur choisie, et je n'oublie pas de mesurer sa taille pour écrire la partie de mot suivante.
Il faut également adapter la taille du contrôle à la nouvelle taille du texte.

Ensuite, il ne reste plus qu'à utiliser notre contrôle, par exemple dans le constructeur :

Code vb.net : Sélectionner tout
1
2
3
4
5
6
Dim monLabel As New MonLabel()  
  
AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font  
monLabel.Font = (New System.Drawing.Font("Microsoft Sans Serif", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CByte((0))))  
monLabel.Text = "Je m'appelle Nico-pyright(c)"  
Me.Controls.Add(monLabel)

Mis à jour le 29 octobre 2013 nico-pyright(c)

Voici une procédure qui liste toutes les forms (ouvertes ou non) de votre projet :

Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Function ListerForms() As ArrayList 
    Dim resultat As New ArrayList 
  
    Dim a As Reflection.Assembly = System.Reflection.Assembly.GetAssembly(Me.GetType) 
    For Each t As Type In a.GetTypes 
        If GetType(Form).IsAssignableFrom(t) Then 
            Dim f As Form = CType(Activator.CreateInstance(t), Form) 
            resultat.Add(f) 
        End If 
    Next 
  
    Return resultat 
End Function

Mis à jour le 29 octobre 2013 Aspic olsimare

Il faut parcourir la collection du conteneur en typant sur le contrôle. (Pour filtrer les éléments de la collection du conteneur en fonction du type spécifié.)

Exemple pour la couleur de fond de tous les TextBox de la Form :

Code VB.NET : Sélectionner tout
1
2
3
        For Each ctrl In Me.Controls.OfType(Of TextBox)() 
            ctrl.BackColor = Color.LightGoldenrodYellow ' colorise le fond 
        Next

Pour un autre type de conteneur remplacer Me par le conteneur.
Exemple pour la couleur de fond de tous les boutons du conteneur MyPanel :
Code VB.NET : Sélectionner tout
1
2
3
        For Each btn In MyPanel.Controls.OfType(Of Button)() 
            btn.BackColor = Color.LightSkyBlue 
        Next

Mis à jour le 16 novembre 2014 rv26t

Il faut parcourir la collection du premier conteneur et effectuer un appel récursif sur les conteneurs enfants.
Il peut être nécessaire de typer l'élément traité pour accéder à ces propriétés spécifiques.

Exemple pour initialiser tous les contrôles.

Code VB.NET : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    ''' <summary>Initialise les contrôles à vide, ou sans sélection (pour les listes).</summary>  
    ''' <param name="controle">un contrôle quelconque pouvant lui même contenir d'autres contrôles (ex: form, panel, groupbox, ...)</param>  
    ''' <remarks>Procédure récursive sur les enfants (s'il y en a) du contrôle avec action en fonction du type de chacun ("Select Case").</remarks>  
    Sub InitControl(controle As Control) 
        Select Case controle.GetType()                           ' Sélection en fonction du type du contrôle 
            Case GetType(TextBox), GetType(ComboBox)             ' Sur une propriété appartenant au type de base (Control), pas besoin de cast 
                controle.Text = Nothing 
            Case GetType(ListBox)                                ' Sur une propriété spécifique au contrôle, il faut typer le contrôle pour accéder à celle-ci 
                DirectCast(controle, ListBox).ClearSelected() 
            Case GetType(CheckBox)                               ' Une "même" propriété (même nom) n'implique pas forcément un type commun 
                DirectCast(controle, CheckBox).Checked = False 
            Case GetType(RadioButton) 
                DirectCast(controle, RadioButton).Checked = False 
                ' ... 
        End Select 
  
        For Each child As Control In controle.Controls           ' parcourt les "sous-contrôle" que celui-ci possède (ou ne fait rien s'il n'y en a pas) 
            InitControl(child) 
        Next 
    End Sub

Appel sur une Form
Code VB.NET : Sélectionner tout
        InitControl(Me)

Mis à jour le 1er mai 2015 Sehnsucht

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

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 © 2017 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

 
Responsable bénévole de la rubrique Microsoft DotNET : Hinault Romaric -