viernes, 5 de abril de 2013

Menú contextual y grid view de windows forms

Enunciado

Imagina un gridview con varias filas. Haces click con el botón derecho y se despliega un menú contextual con opciones editar, borrar,...etc.
Quieres que si eliges editar se abra una ventana para editar la fila sobre la que estas pinchando.
El problema es que las propiedades currentRow y SelectedRows no corresponden a la fila que pinchas.

Solución

Hay que interceptar el evento mousedown para cambiar la selección a la fila debajo del pincho del ratón.

    Private Sub gvContactos_clickContexto(sender As Object, e As MouseEventArgs) Handles gvContactos.MouseDown

        Dim hti = gvContactos.HitTest(e.X, e.Y)
        If (hti.Type = DataGridViewHitTestType.Cell) Or (hti.Type = DataGridViewHitTestType.RowHeader) Then
            gvContactos.ClearSelection()
            gvContactos.Rows(hti.RowIndex).Selected = True
        End If

    End Sub

    Private Sub gvContactos_EditarActiv(sender As Object, e As System.EventArgs) Handles gvContactos.DoubleClick,
                                                                                        btnEditaActivContacto.Click,
                                                                                         btnCtxEditActivCto.Click
        If gvContactos.SelectedRows.Count = 1 Then editaActivContacto(CType(gvContactos.SelectedRows(0).DataBoundItem, tblFbContacto))
    End Sub

    Private Sub gvcontactoEdita_Click(sender As Object, e As System.EventArgs) Handles btnEditaContacto.Click,
                                                                                    btnCtxEditarContacto.Click
        If gvContactos.SelectedRows.Count = 1 Then
            editaContacto(CType(gvContactos.SelectedRows(0).DataBoundItem, tblFbContacto))
        End If
    End Sub
Algunos ejemplos que he visto comprueban si se ha pulsado el botón derecho o el izquierdo en el argumento del evento mousedown. En mi caso no lo hago porque en cualquier caso quiero reducir la selección a una fila.

No hay comentarios: