Retrouver élement de départ d'un ContextMenuStrip [Résolu]

Messages postés
67
Date d'inscription
mercredi 5 mai 2010
Dernière intervention
20 mai 2011
- 13 sept. 2010 à 22:34 - Dernière réponse :
Messages postés
67
Date d'inscription
mercredi 5 mai 2010
Dernière intervention
20 mai 2011
- 15 sept. 2010 à 06:40
Bonjour,

J'ai ajouter un ContextMenuStrip à un Button. J'aimerais savoir comment retouver le Button a partir du ToolStrip clické.

Voici où j'en suis :

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim s As New ContextMenuStrip
        Dim m As New ToolStripMenuItem
        Dim c As New ToolStripComboBox

        c.Items.Add("azerty")
        c.Items.Add("qsdfgh")

        AddHandler c.SelectedIndexChanged, AddressOf Msg

        m.Text = "Test"
        m.DropDownItems.Add(c)

        s.Items.Add(m)

        Button2.ContextMenuStrip = s
    End Sub

    Sub Msg(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim c As ToolStripComboBox

        c = DirectCast(sender, ToolStripComboBox)

        MsgBox(c.Text)
    End Sub


Dans la procédure Msg j'aimerais faire différente opération a partir du Button2 (dans cette exemple) sachant qu'a therme cette procédure pourrait être lancée depuis plusieurs Button.
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
423
Date d'inscription
vendredi 17 novembre 2006
Dernière intervention
15 juillet 2014
- 14 sept. 2010 à 14:49
3
Merci
On peut aussi corriger le bug en créant son propre ContextMenuSrip corrigé :
Public Class ContextMenuStripCor
    Inherits ContextMenuStrip

    Private _source As Control

    Protected Overrides Sub OnOpening(ByVal e As System.ComponentModel.CancelEventArgs)
        _source = MyBase.SourceControl
        MyBase.OnOpening(e)
    End Sub

    Public Shadows ReadOnly Property SourceControl() As Control
        Get
            Return _source
        End Get
    End Property

End Class


Dans ce cas on pourra faire :

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    
    Dim s As New ContextMenuStripCor
    Dim m As New ToolStripMenuItem
    Dim c As New ToolStripComboBox

    c.Items.Add("azerty")
    c.Items.Add("qsdfgh")
    c.Name = "ToolStripComboBox1"

    AddHandler c.SelectedIndexChanged, AddressOf Msg

    m.Text = "Test"
    m.DropDownItems.Add(c)
    m.Name = "ToolStripMenuItem1"

    s.Items.Add(m)
    s.Name = "ContextMenuStrip1"

    Button1.ContextMenuStrip = s
End Sub

Sub Msg(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripComboBox2.SelectedIndexChanged

    'Le combo
    Dim c As ToolStripComboBox = CType(sender, ToolStripComboBox)
    MessageBox.Show(c.Name)

    'L'item de menu
    Dim m As ToolStripMenuItem = CType(c.OwnerItem, ToolStripMenuItem)
    MessageBox.Show(m.Name)

    'Le menu context
    Dim s As ContextMenuStripCor = CType(m.GetCurrentParent(), ContextMenuStripCor)
    MessageBox.Show(s.Name)

    'Le bouton
    Dim b As Button = CType(s.SourceControl, Button)
    MessageBox.Show(b.Name)

End Sub

Merci foliv57 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de foliv57
Messages postés
423
Date d'inscription
vendredi 17 novembre 2006
Dernière intervention
15 juillet 2014
- 13 sept. 2010 à 23:36
0
Merci
Bonjour,

Voici la chaine d'exécution :

Private Sub Msg(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripComboBox1.SelectedIndexChanged, ToolStripComboBox2.SelectedIndexChanged
    
    'Le combo
    Dim c As ToolStripComboBox = CType(sender, ToolStripComboBox)
    MessageBox.Show(c.Name)
    
    'Le menu context
    Dim t As ContextMenuStrip = c.GetCurrentParent()
    MessageBox.Show(t.Name)
    
    'Le bouton
    Dim b As Button = CType(t.SourceControl, Button)
    MessageBox.Show(b.Name)

End Sub
Commenter la réponse de foliv57
Messages postés
67
Date d'inscription
mercredi 5 mai 2010
Dernière intervention
20 mai 2011
- 14 sept. 2010 à 12:42
0
Merci
Merci pour ton aide joliv57,

La chaine d'exécution que tu m'as donner fonctionne bien si j'avait fait :

s.Items.Add(c)


au lieu de :

s.Items.Add(m)


Cela dit ça me donne déja une bonne base.

Je pense que le problème qui reste est dut au niveau dans lequel est situé le ToolStripComboBox.
En effet, je fait add du ToolStripComboBox dans un ToolStripMenuItem avant d'ajouter ce dernier au ContextMenuStrip.

J'ai essayer de retrouver le ToolStripMenuItem en fesant un GetCurrentParent comme tu me l'as montrer mais ça ne fonctionne pas.
Y-a-t-il une autre fonction a utiliser ?
Commenter la réponse de ccito
Messages postés
67
Date d'inscription
mercredi 5 mai 2010
Dernière intervention
20 mai 2011
- 14 sept. 2010 à 13:07
0
Merci
J'ai essayer cela :

        'Le MenuItem
        Dim m As ToolStripMenuItem = DirectCast(c.OwnerItem, ToolStripMenuItem)
        MessageBox.Show(m.Text)

        'Le menu context
        Dim t As ContextMenuStrip = m.GetCurrentParent()
        MessageBox.Show(t.Text)


mais le t.SourceControl est alors égal à Nothing.
Commenter la réponse de ccito
Messages postés
423
Date d'inscription
vendredi 17 novembre 2006
Dernière intervention
15 juillet 2014
- 14 sept. 2010 à 14:26
0
Merci
C'est exact, t.SourceControl renvoi Nothing. Il semblerait que ce soit un bug du framework dans le cas de sous-menu.

La manière la plus simple de contourner le problème est de faire :
Private _Source As Control

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim s As New ContextMenuStrip
    Dim m As New ToolStripMenuItem
    Dim c As New ToolStripComboBox

    c.Items.Add("azerty")
    c.Items.Add("qsdfgh")
    c.Name = "ToolStripComboBox1"

    AddHandler c.SelectedIndexChanged, AddressOf Msg

    m.Text = "Test"
    m.DropDownItems.Add(c)
    m.Name = "ToolStripMenuItem1"

    s.Items.Add(m)
    s.Name = "ContextMenuStrip1"
    AddHandler s.Opened, AddressOf Context_Opened

    Button1.ContextMenuStrip = s
End Sub

Private Sub Context_Opened(ByVal sender As Object, ByVal e As System.EventArgs)
    _Source = CType(sender, ContextMenuStrip).SourceControl
End Sub

Sub Msg(ByVal sender As System.Object, ByVal e As System.EventArgs)

    'Le bouton
    Dim b As Button = CType(_Source, Button)
    MessageBox.Show(b.Name)

End Sub
Commenter la réponse de foliv57
Messages postés
67
Date d'inscription
mercredi 5 mai 2010
Dernière intervention
20 mai 2011
- 15 sept. 2010 à 06:40
0
Merci
Super ça fonctionne parfaitement
Commenter la réponse de ccito

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.