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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 Expert Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    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 ...

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    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 confirmé
    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
    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 Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 700
    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 Expert Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    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 ... )

  7. #7
    Membre confirmé
    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
    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

+ 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