ContextMenuStrip

di il
12 risposte

ContextMenuStrip

Ciao a tutti
Ho un controllo DataGridView a cui ho abbinato un controllo ContextMenuStrip. Quando clicco in una cella del DataGridView
visualizza un sottomenu da cui scaturiscono delle scelte. Tutto ok
Avrei bisogno di sapere la riga e la cella della DataGridView su cui è avvenuto l'evento click.
Qualcuno mi può indirizzare nella giusta soluzione?

12 Risposte

  • Re: ContextMenuStrip

    Qui (https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.datagridview.cellclick?view=windowsdesktop-6.0) hai sia il rowindex che il columnindex della cella su cui è avvenuto l'evento click
  • Re: ContextMenuStrip

    Ciao
    Avevo visto quella parte di codice ma non sono riuscito a farla funzionare. Sono risalito al codice originale, il gioco Tic-Tac ma non riesce nemmeno a partire.
    L'unica cosa che ottengo è un form vuoto.
    Tu hai esempi reali?
  • Re: ContextMenuStrip

    Quello è un esempio da cui imparare.

    Cosa hai fatto che non funziona?
  • Re: ContextMenuStrip

    Ciao
    Ho creato una applicazione con un form, un Datagridview popolato con 5 colonne, un contextmenustrip con 3 scelte
    Dall'esempio ho aggiunto
    Public Custom Event CellClick As DataGridViewCellEventHandler

    ma automaticamente ha aggiunto:
    AddHandler(value As DataGridViewCellEventHandler)
    End AddHandler
    RemoveHandler(value As DataGridViewCellEventHandler)
    End RemoveHandler
    RaiseEvent(sender As Object, e As DataGridViewCellEventArgs)
    End RaiseEvent
    End Event


    Ho aggiunto la sub dell'esempio modificandola dove dava errore e cercando di ottenere e.RowIndex e e.ColumnIndex
    ho sostituito ImageCell con TextBoxCell
    Ecco il codice completo
    Imports System.IO
    Imports System.Windows.Forms
    Imports System.Drawing
    
    
    Public Class Form1
        Public Custom Event CellClick As DataGridViewCellEventHandler
            AddHandler(value As DataGridViewCellEventHandler)
    
            End AddHandler
            RemoveHandler(value As DataGridViewCellEventHandler)
    
            End RemoveHandler
            RaiseEvent(sender As Object, e As DataGridViewCellEventArgs)
    
            End RaiseEvent
        End Event
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim i As Int16
            For i = 0 To 5
                DataGridView1.Rows.Add("aadd", "bbdd", "ccdd")
            Next
        End Sub
        Private Sub dataGridView1_CellClick(ByVal sender As Object,
        ByVal e As DataGridViewCellEventArgs) _
        Handles dataGridView1.CellClick
    
            'If turn.Text.Equals(gameOverString) Then Return
            Dim xr As Int16, xc As Int16
            Dim cell As DataGridViewImageCell =
                CType(dataGridView1.Rows(e.RowIndex).
                    Cells(e.ColumnIndex), DataGridViewImageCell)
    
            xr = e.RowIndex
            xc = e.ColumnIndex
    
        End Sub
    End Class
    Se lo eseguo con il ContextMenuStrip abbinato al DataGridView mi rileva la pressione del solo tasto sinistro
    e visualizza l'indice di riga e colonna, mentre la pressione del tasto destro fa apparire il contexmenu e basta, senza rilevare gli indici
    Cercavo di ottenere gli indici contemporaneamente al ContextMenu. E' possibile?
  • Re: ContextMenuStrip

    Sfrutta l'evento CellMouseClick, nel quale puoi rilevare quale bottone del mouse è stato premuto (e.Button) e le coordinate della cella (e.RowIndex, e.ColumnIndex).
    Comunque, il controllo DataGridView, come molti altri, ha un'apposita proprietà ContextMenuStrip.
    Elimina quella parte di codice che dici sia stata "aggiunta automaticamente".
  • Re: ContextMenuStrip

    Ciao,
    Funziona perfettamente se tolgo il collegamento con il ContextMenuStrip, tasto destro e sinistro e indici
    Se il DataGridView è collegato al ContextMenuStrip rivela solo il tasto sinistro, se clicco il destro mi visualizza il sottomenu senza le indicazioni di riga e cella.
    Posso fare a meno del ContextMenuStrip se gestisco manualmente il sottomenu(groupbox + label e evento label.click)
  • Re: ContextMenuStrip

    Cosa intendi con "collegamento con il ContextMenuStrip" ? Se intendi: impostare la proprietà ContextMenuStrip del DataGridView sul controllo ContextMenuStrip aggiunto al form" allora funziona bene con il pulsante destro.
  • Re: ContextMenuStrip

    Se imposto il collegamento tra DataGridView1 e ContextMenuStrip1 nelle proprietà il tasto destro del mouse mi fà apparire il sottomenu e non la messagebox
  • Re: ContextMenuStrip

    Di quale MessageBox parli? Io non ne vedo. Forse vuoi visualizzare le coordinate della cella? E a che scopo? L'importante è che il Context Menu appaia nel punto giusto, no?
  • Re: ContextMenuStrip

    Nel programma di prova di CellMouseClick
    https://docs.microsoft.com/it-it/dotnet/api/system.windows.forms.datagridview.cellmouseclick?view=windowsdesktop-6.0

    visualizza una MessageBox con tutti i dati che possono interessare.
    Ho fatto un prg con un form, un Datagridview e un ContextMenuGrid
    Imports System.IO
    Imports System.Windows.Forms
    Imports System.Drawing
    
    
    Public Class Form1
        Public Custom Event CellMouseClick As DataGridViewCellMouseEventHandler
            AddHandler(value As DataGridViewCellMouseEventHandler)
            End AddHandler
            RemoveHandler(value As DataGridViewCellMouseEventHandler)
            End RemoveHandler
            RaiseEvent(sender As Object, e As DataGridViewCellMouseEventArgs)
            End RaiseEvent
        End Event
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim i As Int16
            For i = 0 To 5
                DataGridView1.Rows.Add("aadd", "bbdd", "ccdd")
            Next
        End Sub
    
        Private Sub DataGridView1_CellMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) _
         Handles DataGridView1.CellMouseClick
    
            Dim messageBoxVB As New System.Text.StringBuilder()
            messageBoxVB.AppendFormat("{0} = {1}", "ColumnIndex", e.ColumnIndex)
            messageBoxVB.AppendLine()
            messageBoxVB.AppendFormat("{0} = {1}", "RowIndex", e.RowIndex)
            messageBoxVB.AppendLine()
            messageBoxVB.AppendFormat("{0} = {1}", "Button", e.Button)
            messageBoxVB.AppendLine()
            messageBoxVB.AppendFormat("{0} = {1}", "Clicks", e.Clicks)
            messageBoxVB.AppendLine()
            messageBoxVB.AppendFormat("{0} = {1}", "X", e.X)
            messageBoxVB.AppendLine()
            messageBoxVB.AppendFormat("{0} = {1}", "Y", e.Y)
            messageBoxVB.AppendLine()
            messageBoxVB.AppendFormat("{0} = {1}", "Delta", e.Delta)
            messageBoxVB.AppendLine()
            messageBoxVB.AppendFormat("{0} = {1}", "Location", e.Location)
            messageBoxVB.AppendLine()
            MessageBox.Show(messageBoxVB.ToString(), "CellMouseClick Event")
    
        End Sub
    
    
    End Class

    Senza il ContextMenuGrid come premi il pulsante del mouse qualunque sia appare una MessageBox con le indicazioni di riga/colonna
    Se colleghi il ContextMenuGrid al DataGridView la messagebox appare solo se usi il tasto sinistro, mentre cliccando con il
    tasto destro a video appare il sottomenu del ContextMenuGrid senza però avere gli indici di riga e colonna che servono al mio programma. Per questo ho scritto questo post; vedere se è possibile elaborare nella chiamata al ContextMenuGrid anche gli indici
  • Re: ContextMenuStrip

    Allora puoi fare così:
    Non inserire il contextmenu nel form ma crealo da codice in questo evento:
    
        Private Sub DataGridView1_CellContextMenuStripNeeded(sender As Object, e As DataGridViewCellContextMenuStripNeededEventArgs) Handles DataGridView1.CellContextMenuStripNeeded
            Dim menu As New ContextMenuStrip
            menu.Items.Add("AAAAAA")
            menu.Items.Add("BBBBBB")
            menu.Items.Add("CCCCCC")
            menu.Items.Add("DDDDDD")
            e.ContextMenuStrip = menu
            MessageBox.Show(e.RowIndex & " " & e.ColumnIndex)
        End Sub
    
    In questo caso però la DataGridView deve avere impostata la proprietà DataSource.
  • Re: ContextMenuStrip

    Ok ci provo
Devi accedere o registrarti per scrivere nel forum
12 risposte