Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di Mabi
    Registrato dal
    May 2002
    Messaggi
    1,245

    [VB .NET] ContextMenuStrip sender

    Ciao. Ho un problema con un ContextMenuStrip che visualizzo alla pressione del tasto destro su delle PictureBox. Il menù è su due livelli con una voce che ne contiene tre.
    Vorrei riuscire a capire qual è l'oggetto (PictureBox) che ha originato l'evento.

    Al momento con questo codice riesco a farlo solo a partire dal livello superiore e non dalle tre voci
    Grazie
    codice:
    Public Class Form1
    
        Private Sub PictureBox1_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseUp
            Menu_1(PictureBox1, e)
        End Sub
    
        Private Sub PictureBox2_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox2.MouseUp
            Menu_1(PictureBox2, e)
        End Sub
    
        Private Sub Menu_1(sender As Object, e As MouseEventArgs)
            If (e.Button <> System.Windows.Forms.MouseButtons.Right) Then Return
    
            Dim tm = New ToolStripMenuItem("Livello superiore")
            Dim cms As New ContextMenuStrip
            cms.Items.Add(tm)
            AddHandler cms.Items(0).Click, AddressOf mnuItem_Clicked
    
            Dim item1 = New ToolStripMenuItem("Elemento 1")
            item1.Tag = item1.Text
            tm.DropDownItems.Add(item1)
            AddHandler item1.Click, AddressOf mnuItem_Clicked
            Dim item2 = New ToolStripMenuItem("Elemento 2")
            item2.Tag = item2.Text
            tm.DropDownItems.Add(item2)
            AddHandler item2.Click, AddressOf mnuItem_Clicked
            Dim item3 = New ToolStripMenuItem("Elemento 3")
            item3.Tag = item3.Text
            tm.DropDownItems.Add(item3)
            AddHandler item3.Click, AddressOf mnuItem_Clicked
    
            cms.Show(sender, e.Location)
        End Sub
    
        Private Sub mnuItem_Clicked(sender As Object, e As EventArgs)
            Dim MenuItem1 As ToolStripItem = sender
            Dim owner As ContextMenuStrip = MenuItem1.Owner
            Dim sourcecontrol As Control = owner.SourceControl
    
            MsgBox(sourcecontrol.Name)
        End Sub
    End Class
    ... e non usare while wend è una sintassi deprecata

  2. #2
    Utente di HTML.it L'avatar di Mabi
    Registrato dal
    May 2002
    Messaggi
    1,245
    Nessuna idea?
    ... e non usare while wend è una sintassi deprecata

  3. #3
    Penso di sapere come risolvere il tuo problema ma prima voglio provarlo.
    Oggi pomeriggio dovrei riuscire a risponderti.
    Giorgio Mermet
    Sviluppo software & formazione

    Pagina Personale

  4. #4
    E' un discreto problema, dipendente soprattutto dalla versione di Vn.bet hce stai usando.

    Il roblema di fondo e' hce i sottomenu del menu contestuale vengono visti ocme menu "classici" e non tute le versioni di vb ne permettono il casting con ctype.
    Se ci riesci sei a cavallo, senon ci riesci perhce la tua versione di vb non lo permette ... beh diventa un piccolo casino.
    Giorgio Mermet
    Sviluppo software & formazione

    Pagina Personale

  5. #5
    Utente di HTML.it L'avatar di Mabi
    Registrato dal
    May 2002
    Messaggi
    1,245
    Non pensavo potesse essere un problema di versione di VB .NET soprattutto perché uso VS 2015.
    Ti ringrazio comunque per la risposta.

    Ho trovato una soluzione forse poco elegante ma concreta. Al momento della creazione del menù salvo esternamente l'origine di chi ha richiamato l'evento:
    codice:
        Dim Ctrl As Control
    
        Private Sub PictureBox_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseUp, PictureBox2.MouseUp
            Menu_1(sender, e)
        End Sub
    
        Private Sub Menu_1(sender As Object, e As MouseEventArgs)
            If (e.Button <> System.Windows.Forms.MouseButtons.Right) Then Return
    
            Ctrl = sender
    
            Dim tm = New ToolStripMenuItem("Livello superiore")
            Dim cms As New ContextMenuStrip
    
            cms.Items.Add(tm)
            AddHandler cms.Items(0).Click, AddressOf mnuItem_Clicked
    
            Dim item1 = New ToolStripMenuItem("Elemento 1")
            item1.Tag = item1.Text
            tm.DropDownItems.Add(item1)
            AddHandler item1.Click, AddressOf mnuItem_Clicked
            Dim item2 = New ToolStripMenuItem("Elemento 2")
            item2.Tag = item2.Text
            tm.DropDownItems.Add(item2)
            AddHandler item2.Click, AddressOf mnuItem_Clicked
            Dim item3 = New ToolStripMenuItem("Elemento 3")
            item3.Tag = item3.Text
            tm.DropDownItems.Add(item3)
            AddHandler item3.Click, AddressOf mnuItem_Clicked
    
            cms.Show(sender, e.Location)
        End Sub
    
        Private Sub mnuItem_Clicked(sender As Object, e As EventArgs)
            MsgBox(Ctrl.Name)
        End Sub
    ... e non usare while wend è una sintassi deprecata

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.