FAQ VB.NETConsultez toutes les FAQ
Nombre d'auteurs : 37, nombre de questions : 240, dernière mise à jour : 12 mai 2018 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.
- 3.1. Textbox (5)
- 3.2. Datagrid (10)
- 3.3. ListView (4)
- 3.4. TreeView (5)
- 3.5. ComboBox (4)
- 3.6. ListBox (3)
- 3.7. RichTextBox (1)
- 3.8. TabControl (1)
- Comment donner le style windows XP à vos applications ?
- Comment changer le curseur de mon application ?
- Comment permettre à l'utilisateur de choisir un répertoire ?
- Comment permettre à l'utilisateur de choisir un fichier pour ouvrir un document ?
- Comment permettre à l'utilisateur de choisir un fichier pour enregistrer un document ?
- Comment rendre un contrôle transparent ?
- Comment annuler la fermeture de la session Windows ?
- Comment détecter la fermeture intempestive ?
- Comment changer l'icône d'une application ?
- Comment empêcher l'ouverture de la même application plusieurs fois ?
- Comment ajouter un Item(Value, Text) à un ComboBox ?
- Comment accéder à une méthode publique d'une form à partir d'une autre form créée par la première ?
- Comment créer des contrôles dynamiquement et gérer leurs événements ?
- Comment remplir un DataGrid avec un DataAdapter ?
- Comment fonctionne le contrôle LinkLabel ?
- Comment implémenter un PrintScreen rapidement ?
- Comment accéder aux composants graphique à partir d'un autre thread ?
- Comment empêcher la fermeture de la fenêtre ?
- Comment modifier dynamiquement l'icône d'un NotifyIcon ?
- Comment déplacer un contrôle avec la souris ?
- Comment forcer l'évènement Paint ?
- Comment forcer une fenêtre à apparaître à l'avant plan ?
- Comment écrire un label avec plusieurs couleurs ?
- Comment lister toutes les forms d'un projet ?
- Comment intervenir sur un ensemble de même type de contrôles d'un conteneur ?
- Comment intervenir sur tout un ensemble de contrôle en incluant les conteneurs ?
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> |
- 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 |
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 |
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 |
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 |
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 |
Dans le constructeur, il suffit d'ajouter
Code vb.net : | Sélectionner tout |
1 2 | Me.SetStyle(ControlStyles.SupportsTransparentBackColor, True) Me.BackColor = Color.Transparent |
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 |
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 |
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.
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 |
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 |
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 |
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 |
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 |
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 |
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") |
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 |
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 |
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 |
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 |
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 |
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 |
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() |
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)) |
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 |
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 |
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) |
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 |
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 |
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)
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 çaLes 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 © 2024 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.