IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Contrôle existant et classe


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de Basiqueur
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Janvier 2022
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Janvier 2022
    Messages : 16
    Par défaut Contrôle existant et classe
    Bonjour tout le monde,

    Je débute à peine en Vb.Net. En simplifiant au max mon problème, j'aurai besoin de créer une boucle qui associe chaque bouton du form à une class BoutonPerso1 ou une class BoutonPerso2 en fonction de son .Tag. J'ai donc procédé de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            For Each Ctrl As Control In Me.Controls
                If TypeName(Ctrl) = "Button"
                    Select Case Ctrl.Tag
                        Case 1
                            Bouton = New Bouton1
                        Case 2
                            Bouton = New Bouton2
                    End Select
                End If
            Next
        End Sub
    Et visiblement, ce n'est pas comme ça qu'il faut procéder... Je trouve des tas de tutos pour créer et relier des contrôles à une classe mais aucun pour y relier des contacts existants.

    Je vous remercie par avance pour votre aide

  2. #2
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 576
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Public Class Form1
        Private TXTS As Dictionary(Of String, BoutonPerso)
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            TXTS = New Dictionary(Of String, BoutonPerso)
            Dim tS = Me.Controls.OfType(Of TextBox).ToArray
            Dim Cs = Me.Controls.OfType(Of ComboBox).ToArray
            For Each t As TextBox In tS
                TXTS.Add(t.Name, New BoutonPerso) : TXTS(t.Name).Tb = t
            Next
        End Sub
    End Class
    Public Class BoutonPerso
        Public WithEvents Tb As TextBox
        Private Sub TextChanged(sender As Object, e As EventArgs) Handles Tb.TextChanged
            MessageBox.Show($"{sender.name}  {sender.text}")
        End Sub
    End Class

  3. #3
    Membre averti Avatar de Basiqueur
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Janvier 2022
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Janvier 2022
    Messages : 16
    Par défaut
    Bonsoir Thumb down et merci pour ta réponse

    Donc toi tu passes par un dictionnaire. J'avais tenté de passer par une List(Of Control) mais ça ne marchait pas non plus.

    Quoi qu'il en soit, j'ai adapté ton code à mon cas et malheureusement ça ne marche pas mieux. Le code s'exécute mais les contrôles ne déclenchent pas d'action.
    Voici mon adaptation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
        Sub Initialisation_Classe(Fenetre_Source As Control)
            Dico_Bouton_Menu = New Dictionary(Of String, Bouton_Menu)
            Dico_Bouton_Add = New Dictionary(Of String, Bouton_Add)
     
            Dim tS = Fenetre_Source.Controls.OfType(Of Button).ToArray
            For Each Ctrl_Boutton As Button In tS
                Select Case True
                    Case Ctrl_Boutton.Name Like "Menu_*"
                        Dico_Bouton_Menu.Add(Ctrl_Boutton.Name, New Bouton_Menu)
                        Dico_Bouton_Menu(Ctrl_Boutton.Name).Tb = Ctrl_Boutton
                        MsgBox(Ctrl_Boutton.Name & " a été ajouté")
                    Case Ctrl_Boutton.Name Like "Add_*"
                        Dico_Bouton_Add.Add(Ctrl_Boutton.Name, New Bouton_Add)
                        Dico_Bouton_Add(Ctrl_Boutton.Name).Tb = Ctrl_Boutton
                End Select
            Next
        End Sub
     
    Public Class Bouton_Menu : Inherits Button
        Public WithEvents Tb As Button
        Protected Overrides Sub OnClick(e As EventArgs)
            MyBase.OnClick(e)
            MsgBox("Je vais ouvrir le menu " & Me.Tag)
        End Sub
    End Class

  4. #4
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 576
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Public Class Form1
     Dim TXTS As New Dictionary(Of String, BoutonPerso)
      Dim Dico_Bouton_Menu As New Dictionary(Of String, Bouton_Menu)
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
             For Each t As TextBox In Me.Controls.OfType(Of TextBox).ToArray
                TXTS.Add(t.Name, New BoutonPerso) : TXTS(t.Name).Tb = t
            Next
     
            For Each bt As Button In Me.Controls.OfType(Of Button).ToArray
                Dico_Bouton_Menu.Add(bt.Name, New Bouton_Menu(bt))
            Next
        End Sub
    End Class
    Public Class BoutonPerso
        Public WithEvents Tb As TextBox
        Private Sub TextChanged(sender As Object, e As EventArgs) Handles Tb.TextChanged
            MessageBox.Show($"{sender.name}  {sender.text}")
        End Sub
    End Class
    Public Class Bouton_Menu : Inherits Button
        Public WithEvents Bt As Button
        Public Sub New(ByRef Value As Button)
            Bt = Value
        End Sub
        Protected Shadows Sub Click(sender As Object, e As EventArgs) Handles Bt.Click
            MyBase.OnClick(e)
            MsgBox("Je vais ouvrir le menu " & Me.Tag)
        End Sub
    End Class

  5. #5
    Membre averti Avatar de Basiqueur
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Janvier 2022
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Janvier 2022
    Messages : 16
    Par défaut
    Merci
    La ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Dico_Bouton_Menu As New Dictionary(Of String, Bouton_Menu)
    renvoie "La référence d'objet n'est pas définie à une instance d'un objet" et je n'arrive pas trouver de solution.

  6. #6
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 987
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 987
    Par défaut
    La propriété Tag du bouton (ou de n'importe quel autre contrôle) est un objet.
    Tu peux donc y stocker ce que tu veux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Button1.Tag = new BoutonPerso1();
    Button2.Tag = new BoutonPerso2();

  7. #7
    Membre averti Avatar de Basiqueur
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Janvier 2022
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Janvier 2022
    Messages : 16
    Par défaut
    Bonjour popo et merci pour ta réponse,

    Malheureusement le constructeur est bien appelé mais une fois le form affiché, l'évènement Click de la classe ne se déclenche pas quand je clique sur le bouton en question.

    Après je suis expérimenté en Vba mais encore novice en Vb.Net et je n'utilise peut être pas la bonne méthode pour arriver à mes fins.

    J'ai tout simplement un form contenant pas mal de boutons au comportement identique ou presque. Pour factoriser au max mon code, je voulais relier chaque bouton à une classe pour définir le comportement de tous les boutons directement dans ma classe.

  8. #8
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 987
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 987
    Par défaut
    Si tu ne branche pas les évènement, rien ne le fera pour toi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Button1.Tag = new BoutonPerso1()
    Button2.Tag = new BoutonPerso2()
     
     AddHandler Button1.Click, AddressOf Button_Click
     AddHandler Button2.Click, AddressOf Button_Click
    Le code de l'évènement d'un bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Button_Click(sender As Object, e As EventArgs)
        CType(sender.Tag, BoutonPerso).DoClick()
    End Sub

    Tes classes doivent hériter d'une même classe abstraite.
    Cette classe abstraite déclarera une méthode DoClick que tu devras redéfinir dans les classes concrètes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Public MustInherit Class BoutonPerso
     
        Public MustOverride Sub DoClick()
     
    End Class
     
    Public Class BoutonPerso1
        Inherits BoutonPerso
     
        Public Overrides Sub DoClick()
            ' Do something here
        End Sub
     
    End Class
     
    Public Class BoutonPerso2
        Inherits BoutonPerso
     
        Public Overrides Sub DoClick()
            ' Do something else here
        End Sub
     
    End Class
    Tu peux éventuellement passer le sender.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Public MustInherit Class BoutonPerso
     
        Public MustOverride Sub DoClick(sender As Button)
     
    End Class
     
    Public Class BoutonPerso1
        Inherits BoutonPerso
     
        Public Overrides Sub DoClick(sender As Button)
            MessageBox.Show(String.Format(CultureInfo.CurrentCulture, "Clic sur le bouton 1 ({0})", sender.Name))
        End Sub
     
    End Class
     
    Public Class BoutonPerso2
        Inherits BoutonPerso
     
        Public Overrides Sub DoClick(sender As Button)
            MessageBox.Show(String.Format(CultureInfo.CurrentCulture, "Clic sur le bouton 2 ({0})", sender.Name))
        End Sub
     
    End Class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Button_Click(sender As Object, e As EventArgs)
        CType(sender.Tag, BoutonPerso).DoClick(sender)
    End Sub

Discussions similaires

  1. Contrôle Existence d'un membre dans un PDS en JCL
    Par magfred03 dans le forum JCL - SORT
    Réponses: 4
    Dernier message: 27/10/2009, 12h39
  2. Comment modifier un contrôle depuis une classe ?
    Par pot2yaourt dans le forum Windows Forms
    Réponses: 2
    Dernier message: 25/07/2009, 15h01
  3. Nouveaux contrôles (existant comme activeX)
    Par statquant dans le forum Windows Forms
    Réponses: 8
    Dernier message: 15/06/2009, 21h45
  4. Contrôle de la classe des objets passés en paramêtres ?
    Par marot_r dans le forum VBA Access
    Réponses: 0
    Dernier message: 07/04/2008, 22h55
  5. [C#] Savoir si un contrôle existe
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 3
    Dernier message: 27/06/2006, 08h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo