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 :

Evenement Click créé dynamiquement


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut Evenement Click créé dynamiquement
    Bonsoir,

    Voila un code simple qui me pose probleme:
    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
    30
    31
    32
    33
    Public Class Form1
        Private p As New Panel
        Private pSwitchOn As Boolean = False
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            p.Size = New Size(8, 8)
            p.BackColor = Color.Red
            p.Location = New Point(20, 20)
            'p.Visible = False
            AddHandler p.Click, AddressOf p_Click
            Me.Controls.Add(p)
        End Sub
     
        Private Sub p_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
            pSwitchOn = Not pSwitchOn
            If pSwitchOn Then
                p.BackColor = Color.Green
            Else
                p.BackColor = Color.Blue
            End If
        End Sub
     
        Private Sub PictureBox1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles PictureBox1.MouseEnter
            'p.Visible = True
            p.BringToFront()
        End Sub
     
        Private Sub PictureBox1_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles PictureBox1.MouseLeave
            'p.Visible = False
            p.SendToBack()
        End Sub
     
    End Class
    Sur la Form1, j'ai un simple PictureBox1. Sur ce PictureBox, je cree dynamiquement un Panel qui apparait sur la PictureBox1.
    Les evenements MouseEnter et MouseLeave me font apparaitre ou disparaitre ce Panel.

    Si le Panel se trouve sur la PictureBox1, l'evenement p_Click ne marche pas. Pourquoi? Cet evenement marche tres bien lorsqu'il est a cote de la PictureBox1.

    Il y a surement quelquechose de simple qui m'echappe.
    Merci,

    A+
    JLuc01

  2. #2
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Bonjour,

    Et si tu remplaces
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private WithEvents p As New Panel

    Tu devrais pouvoir mettre ta sub à l'écoute de l'event Click de P

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
         Private Sub p_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles p.Click
            pSwitchOn = Not pSwitchOn
            If pSwitchOn Then
                p.BackColor = Color.Green
            Else
                p.BackColor = Color.Blue
            End If
        End Sub
    Ainsi tu n'as plus à gérer "à la main" l'event comme ci dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      AddHandler p.Click, AddressOf p_Click
    Ps: Ceci dit, tu passes ton panel au 1er plan de ta picturebox sur l'event Mouse_Enter de ta picturebox, et donc je suppose que ta souris sera "sur" ton panel, et qu'ainsi tu quitteras ton event Mouse_Enter pour Mouse_Leave car la souris sera sur le panel, le Mouse_Leave remet ton panneau en arrière plan donc tu repars dans Mouse_Enter etc
    Ce ne sont que des suppositions mais tu risque d'avoir peut-être un fonctionnement étrange ...
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par _Ez3kiel Voir le message
    WithEvents
    ce qui permet de ne pas oublier les RemoveHandler parfois cause de fuite mémoire (à la compilation ca écrit les add et remove handler)

    Citation Envoyé par _Ez3kiel Voir le message
    Ceci dit, tu passes ton panel au 1er plan de ta picturebox sur l'event Mouse_Enter de ta picturebox, et donc je suppose que ta souris sera "sur" ton panel, et qu'ainsi tu quitteras ton event Mouse_Enter pour Mouse_Leave car la souris sera sur le panel, le Mouse_Leave remet ton panneau en arrière plan donc tu repars dans Mouse_Enter etc
    Ce ne sont que des suppositions mais tu risque d'avoir peut-être un fonctionnement étrange ...
    j'ai pensé à un truc du genre, mais si le panel est dans le picturebox, le sendtoback ne peut pas l'envoyer derrière le picturebox
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut
    Bonsoir,

    Merci pour vos reponses.
    Cependant, je crois que la methode utilisee avec AddHandler (no Handles) ou avec WithEvents (Handles sur l'event) revient au meme.

    En fait, le probleme est exactement dans cette Quote.
    Ps: Ceci dit, tu passes ton panel au 1er plan de ta picturebox sur l'event Mouse_Enter de ta picturebox, et donc je suppose que ta souris sera "sur" ton panel, et qu'ainsi tu quitteras ton event Mouse_Enter pour Mouse_Leave car la souris sera sur le panel, le Mouse_Leave remet ton panneau en arrière plan donc tu repars dans Mouse_Enter etc
    Ce ne sont que des suppositions mais tu risque d'avoir peut-être un fonctionnement étrange ...
    Donc, en fait, si je supprime l'event PictureBox1_MouseLeave, l'event p_Click marche, mais je ne peux plus cacher le Panel quand je sors de la PictureBox1.
    Je veux peut-etre le beurre et l'argent du beurre!

    Peut-etre, je dois trouver un autre evenement ou d'autres methodes ???
    Avez-vous une suggestion pour contourner le probleme?

    Merci,
    A+
    JLuc01

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Bonsoir,
    à tester:
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Private Sub PictureBox1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles PictureBox1.MouseEnter
            p.Visible = True
            p.BringToFront()
        End Sub
     
        Private Sub Form1_MouseEnter(sender As Object, e As EventArgs) Handles Me.MouseEnter
            p.Visible = False
            'p.SendToBack()
        End Sub

  6. #6
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    PictureBox1_MouseHover met le panel en .BringToFront
    Donc il apparaît au 1er plan, tu fais ou pas ton p_Click
    Et P_MouseLeave remet le panel en .SendToBack

    Testé et fonctionnel chez moi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Private Sub PictureBox1_MouseHover(sender As Object, e As EventArgs) Handles PictureBox1.MouseHover
            Panel1.BringToFront()
        End Sub
     
        Private Sub Panel1_Click(sender As Object, e As EventArgs) Handles Panel1.Click
            MsgBox("toto")
        End Sub
     
        Private Sub Panel1_MouseLeave(sender As Object, e As EventArgs) Handles Panel1.MouseLeave
            Panel1.SendToBack()
        End Sub


    Citation Envoyé par JLuc01 Voir le message
    Cependant, je crois que la methode utilisee avec AddHandler (no Handles) ou avec WithEvents (Handles sur l'event) revient au meme.
    Oui mais dans ton cas c'est réinventer la roue, le panel est un control, il a ses events déjà codés et prêts à l'emploi, et comme l'a dit Pol63, le compilateur s'occupe lui-même de rajouter les addHandler/removeHandler avec les events "officiels", et je suppose bien d'autres subtilités.
    Ce n'est qu'un conseil pour te faire gagner du temps en débogage de fuite mémoire. (Entre autre ... )
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  7. #7
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut
    Bonsoir,

    Et merci pour les reponses.

    1- chrismonoye, ca marche!
    Mais, ce code est un test pour autre chose.
    En fait, je veux mettre ces evenements dans une Class (une PictureBox personnalisee), par consequent, je ne pense pas que je puisse introduire Form1_MouseEnter dans cette Class.
    Mais, il y a surement quelquechose a creuser.

    2- _Ez3kiel, desole, mais cela marche qu'a moitie chez moi.
    Le Panel apparait et disparait (OK), mais l'event ne marche pas (Le panel clignote et disparait en meme temps).
    Par contre, merci pour l'info sur le AddHandler et WithEvents, il faudra que je m'en souviennes dorenavant.

    Bon, je vais aussi chercher de mon cote.
    Ces suggestions devraient me donner des idees.

    Merci,
    A+
    JLuc01

  8. #8
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut
    Re-bonjour,

    Bizarre, bizarre!

    J'ai essaye le code ci-dessous qui ne marche pas parce que les events lies au Panel p ne respondent pas. Mais si j'ajoute la ligne PictureBox1.Visible = False dans levenement PictureBox1.MouseEnter, alors le Panel reponds.

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Public Class Form1
        Private WithEvents p As New Panel
        Private pSwitchOn As Boolean = False
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            p.Size = New Size(8, 8)
            p.BackColor = Color.Red
            p.Location = New Point(20, 20)
            p.Visible = False
            Me.Controls.Add(p)
        End Sub
     
        Private Sub p_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles p.Click
            pSwitchOn = Not pSwitchOn
            If pSwitchOn Then
                p.BackColor = Color.Green
            Else
                p.BackColor = Color.Blue
            End If
        End Sub
     
        Private Sub PictureBox1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles PictureBox1.MouseEnter
            p.Visible = True
            p.BringToFront()
            'PictureBox1.Visible = False
        End Sub
     
        Private Sub PictureBox1_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles PictureBox1.MouseLeave
            p.SendToBack()
        End Sub
     
        ' ''Private Sub Form1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseEnter
        ' ''    p.Visible = False
        ' ''End Sub
     
        Private Sub p_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles p.MouseEnter
            '
        End Sub
     
    End Class
    Je ne comprends vraiment pas pourquoi l'evenement p.Click ne reponds pas lorsque ma PictureBox est Visible avec le Panel au-dessus.
    Il y a encore quelquechose qui m'echappe ici.

    A+
    JLuc01

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Bonsoir,
    à mon avis il y a conflit lorsque le curseur arrive sur le petit panel du PictureBox :
    - Le pictureBox perd la souris et le panel devrait donc disparaitre.
    - Là, il reste apparent, mais ne répond pas au clic.
    Pourquoi? je ne sais pas.
    Ci dessous, dans la suite de ma réponse précédente, on ne s'occupe que de la sortie réelle du PictureBox, par le biais de son Parent :
    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
        Private Sub PictureBox1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles PictureBox1.MouseEnter
            p.Visible = True
            p.BringToFront()
     
        End Sub
     
        Private WithEvents pictParent As Control
     
        Private Sub PictureBox1_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles PictureBox1.MouseLeave
            pictParent = PictureBox1.Parent
        End Sub
     
        Private Sub pictParent_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles pictParent.MouseEnter
            p.Visible = False
        End Sub

  10. #10
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut
    Re-bonsoir,

    1- chrismonoye, c'est exactement ce que je cherchais.
    Le code marche parfaitement, et de plus, j'ai ete capable de l'adapter a ma Class.

    Je me doutais qu'il fallait utiliser "Parent", mais je ne savais pas du tout comment m'y prendre, surtout avec les evenements.
    Merci beaucoup.

    A+
    JLuc01

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. programmer l`evenement click dynamiquement
    Par lucaazori1988 dans le forum VB.NET
    Réponses: 1
    Dernier message: 19/09/2010, 08h27
  2. LinkButton dynamique et evenement click
    Par Ghunter59 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 21/04/2008, 14h30
  3. besoin d aide evenement click droit
    Par yuvino dans le forum C++Builder
    Réponses: 4
    Dernier message: 05/12/2004, 10h32
  4. Evenement sur objet dynamique
    Par CanardJM dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 19/11/2004, 13h56
  5. [C#] Evenement click dans un Panel
    Par keyser-soze dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/05/2004, 22h21

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