[con VB 2010 /Winforms]

Tengo un DataGridView con varias columnas. Es independiente y no está conectado a cualquier tipo de base de datos, ni nada-simplemente estoy en la etnogénesis de la célula por célula base de la entrada del usuario.

Así que de todos modos, una de las columnas de la DGV es de tipo «imagen» (DataGridViewImageColumn).

Lo que yo estoy tratando de hacer es que cuando una de las imágenes de las células se hace clic en un menú de contexto de la tira se muestra en la exacta ubicación donde la imagen de la célula se hace clic.

Aquí es lo que he conseguido hasta ahora…

Private Sub DataGridView1_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick

        Dim columnName As String = DataGridView1.Columns(e.ColumnIndex).Name
        If columnName = "Image" Then 
         Me.Status_ContextMenuStrip1.Show(Me.DataGridView1.CurrentCell.ContentBounds.Location) ' <-- This isn't right, but I must be close!
        End If

End Sub

Al ejecutar el código anterior y haga clic en una imagen de la célula, el menú contextual que aparece, pero aparece en la esquina superior izquierda de la pantalla. ¿Cómo puedo llegar a aparecer en el lugar exacto en que la hizo clic en la celda que está en? En realidad me gustaría que aparecen justo debajo de la hizo clic en la celda, por lo que tiene un similar efecto visual a un combobox «desplegable» (y sé cómo compensar las coordenadas X e y, tan pronto como puedo averiguar cómo conseguirlo en las proximidades de donde tiene que estar).

Gracias!

3 Comentarios

  1. 5

    Tratar el siguiente código

    Private Sub DataGridView1_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick
        Dim columnName As String = DataGridView1.Columns(e.ColumnIndex).Name
    
        If columnName = "Image" Then
            Dim RowHeight1 As Integer = DataGridView1.Rows(e.RowIndex).Height
            Dim CellRectangle1 As Rectangle = DataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, False)
    
            CellRectangle1.X += DataGridView1.Left
            CellRectangle1.Y += DataGridView1.Top + RowHeight1
    
            Dim DisplayPoint1 As Point = PointToScreen(New Point(CellRectangle1.X, CellRectangle1.Y))
    
            ContextMenuStrip1.Show(DisplayPoint1)
        End If
    End Sub
    • Gracias David… le agradezco que se haya tomado el tiempo para que después de todo eso! Sólo probado el código, y que «en el barrio» de la ubicación correcta, así que podría compensar si ese era el único problema. Pero, por desgracia, el problema más grande es que cuando se mueve alrededor de la interfaz de usuario cambia de tamaño. Hice un poco más la investigación en línea y aunque encontré una buena solución, después de un poco de ajustes. En caso de que alguien esté interesado, es ShaneO la respuesta en este enlace –> bytes.com/topic/visual-basic-net/answers/…
    • El GetCellDisplayRectangle método devuelve un rectángulo que tiene una ubicación con respecto a su contenedor. En este ejemplo, su envase es sólo la Forma.
  2. 3

    Para cualquier persona luchando con esto en el futuro – esto es lo que realmente funciona:

    'For forms
    Dim f as New Form2
    f.Location = DGV.PointToScreen(DGV.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, False).Location)

    Para el caso de este post:

    Private Sub DataGridView1_CellClick(ByVal sender As System.Object, ByVal e As
      Dim DisplayPoint1 As Point = DGV.PointToScreen(DGV.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, False).Location)
    ContextMenuStrip1.Show(DisplayPoint1)
    End Sub
    • He tenido un problema similar y encontró el código de arriba para ser una solución para visualizar el ContextMenuStrip en la esquina superior izquierda de una celda, siempre. Dado que la posición Y estaba en lo correcto, pero no el X, me quedé con la posición X de los argumentos del evento. Modo de usar: contextMenuStrip1.Mostrar(nueva letra e.X, DisplayPoint1.Y)) funcionó a la perfección.
  3. 0

    Pruebe a cambiar el código como este ..

    Private Sub DataGridView1_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick
    
        Dim columnName As String = DataGridView1.Columns(e.ColumnIndex).Name
        If columnName = "Image" Then 
           DataGridView1.CurrentCell = dgvDataDaftar.Rows(e.RowIndex).Cells(e.ColumnIndex)
           Me.Status_ContextMenuStrip1.Show(dgvDataDaftar, DataGridView1.PointToClient(Windows.Forms.Cursor.Position))
        End If
    
    End Sub

Dejar respuesta

Please enter your comment!
Please enter your name here