Retrouver élement de départ d'un ContextMenuStrip

Résolu
ccito Messages postés 67 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 20 mai 2011 - 13 sept. 2010 à 22:34
ccito Messages postés 67 Date d'inscription mercredi 5 mai 2010 Statut Membre 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.

6 réponses

foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
14 sept. 2010 à 14:49
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
3
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
13 sept. 2010 à 23:36
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
0
ccito Messages postés 67 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 20 mai 2011 1
14 sept. 2010 à 12:42
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 ?
0
ccito Messages postés 67 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 20 mai 2011 1
14 sept. 2010 à 13:07
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
14 sept. 2010 à 14:26
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
0
ccito Messages postés 67 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 20 mai 2011 1
15 sept. 2010 à 06:40
Super ça fonctionne parfaitement
0
Rejoignez-nous