Saltar al contenido

¿Cómo manejar el evento de clic en la columna de botones en Datagridview?

Al fin luego de mucho batallar hemos encontrado el resultado de esta obstáculo que algunos de nuestros lectores de nuestra web han tenido. Si tienes algún dato que aportar no dudes en compartir tu comentario.

Solución:

Ha agregado un botón a su DataGridView y desea ejecutar algún código cuando se hace clic en él.
Fácil, solo sigue estos pasos:

No hacer:

Primero, esto es lo que NO hacer:

Evitaría las sugerencias en algunas de las otras respuestas aquí e incluso las proporciona la documentación en MSDN para codificar el índice de la columna o el nombre de la columna para determinar si se hizo clic en un botón. El evento de clic se registra para toda la cuadrícula, por lo que de alguna manera debe determinar que se hizo clic en un botón, pero no debe hacerlo asumiendo que su botón vive en un nombre de columna o índice en particular … hay una manera más fácil …

Además, tenga cuidado con el evento que desea manejar. Nuevamente, la documentación y muchos ejemplos se equivocan. La mayoría de los ejemplos manejan el CellClick evento que disparará:

cuando se hace clic en cualquier parte de una celda.

… pero también disparará siempre que el hilera se hace clic en el encabezado. Esto requiere agregar código adicional simplemente para determinar si el e.RowIndex el valor es menor que 0

En su lugar, maneje el CellContentClick que solo ocurre:

cuando se hace clic en el contenido de una celda

Por alguna razón, el columna El encabezado también se considera ‘contenido’ dentro de una celda, por lo que aún tendremos que verificarlo a continuación.

Dos:

Así que esto es lo que debes hacer:

Primero, emitir el remitente a escribir DataGridView para exponer sus propiedades internas en tiempo de diseño. Puede modificar el tipo en el parámetro, pero eso a veces puede dificultar la adición o eliminación de controladores.

A continuación, para ver si se hizo clic en un botón, solo verifique para asegurarse de que la columna que genera el evento sea del tipo DataGridViewButtonColumn. Porque ya enviamos el remitente para que escriba DataGridView, podemos conseguir el Columns colección y seleccione la columna actual usando e.ColumnIndex. Luego verifique si ese objeto es de tipo DataGridViewButtonColumn.

Por supuesto, si necesita distinguir entre varios botones por cuadrícula, puede seleccionar en función del nombre o índice de la columna, pero esa no debería ser su primera comprobación. Siempre asegúrese de que se hizo clic en un botón primero y luego maneje cualquier otra cosa de manera apropiada. En la mayoría de los casos en los que solo tiene un botón por cuadrícula, puede saltar directamente a las carreras.

Poniendolo todo junto:

C#:

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)

    var senderGrid = (DataGridView)sender;

    if (senderGrid.Columns[e.ColumnIndex] is DataGridViewButtonColumn &&
        e.RowIndex >= 0)
    
        //TODO - Button Clicked - Execute Code Here
    

VB:

Private Sub DataGridView1_CellContentClick(sender As System.Object, e As DataGridViewCellEventArgs) _
                                           Handles DataGridView1.CellContentClick
    Dim senderGrid = DirectCast(sender, DataGridView)

    If TypeOf senderGrid.Columns(e.ColumnIndex) Is DataGridViewButtonColumn AndAlso
       e.RowIndex >= 0 Then
        'TODO - Button Clicked - Execute Code Here
    End If

End Sub

Actualización 1 – Evento personalizado

Si desea divertirse un poco, puede agregar su propio evento para que se genere cada vez que se hace clic en un botón en el DataGrid. No puede agregarlo al DataGrid en sí, sin ensuciarse con la herencia, etc., pero puede agregar un evento personalizado a su formulario y activarlo cuando sea apropiado. Es un poco más de código, pero la ventaja es que ha separado lo que quiere hacer cuando se hace clic en un botón y cómo determinar si se hizo clic en un botón.

Simplemente declare un evento, publíquelo cuando sea apropiado y trátelo. Se verá así:

Event DataGridView1ButtonClick(sender As DataGridView, e As DataGridViewCellEventArgs)

Private Sub DataGridView1_CellContentClick(sender As System.Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
    Dim senderGrid = DirectCast(sender, DataGridView)
    If TypeOf senderGrid.Columns(e.ColumnIndex) Is DataGridViewButtonColumn AndAlso e.RowIndex >= 0 Then
        RaiseEvent DataGridView1ButtonClick(senderGrid, e)
    End If
End Sub

Private Sub DataGridView1_ButtonClick(sender As DataGridView, e As DataGridViewCellEventArgs) Handles Me.DataGridView1ButtonClick
    'TODO - Button Clicked - Execute Code Here
End Sub

Actualización 2 – Cuadrícula extendida

Lo que sería genial es si estuviéramos trabajando con una cuadrícula que simplemente hiciera estas cosas por nosotros. Podríamos responder fácilmente a la pregunta inicial: you've added a button to your DataGridView and you want to run some code when it's clicked. Aquí hay un enfoque que amplía el DataGridView. Puede que no valga la pena la molestia de tener que entregar un control personalizado con cada biblioteca, pero al menos reutiliza al máximo el código utilizado para determinar si se hizo clic en un botón.

Solo agregue esto a su ensamblaje:

Public Class DataGridViewExt : Inherits DataGridView

    Event CellButtonClick(sender As DataGridView, e As DataGridViewCellEventArgs)

    Private Sub CellContentClicked(sender As System.Object, e As DataGridViewCellEventArgs) Handles Me.CellContentClick
        If TypeOf Me.Columns(e.ColumnIndex) Is DataGridViewButtonColumn AndAlso e.RowIndex >= 0 Then
            RaiseEvent CellButtonClick(Me, e)
        End If
    End Sub

End Class

Eso es todo. No lo vuelva a tocar nunca. Asegúrese de que su DataGrid sea de tipo DataGridViewExt que debería funcionar exactamente igual que un DataGridView. Excepto que también generará un evento adicional que puede manejar así:

Private Sub DataGridView1_ButtonClick(sender As DataGridView, e As DataGridViewCellEventArgs) _
                                      Handles DataGridView1.CellButtonClick
    'TODO - Button Clicked - Execute Code Here
End Sub

Eso se responde completamente aquí para WinForms: Clase DataGridViewButtonColumn

y aquí: Cómo: Responder a eventos de botón en un control GridView

para Asp.Net dependiendo del control que esté usando realmente. (Su pregunta dice DataGrid, pero está desarrollando una aplicación de Windows, por lo que el control que usaría allí es un DataGridView …)

Esta es la mejor respuesta:

No puede implementar un evento de clic de botón para celdas de botón en un DataGridViewButtonColumn. En su lugar, usa el evento CellClicked de DataGridView y determina si el evento se disparó para una celda en su DataGridViewButtonColumn. Utilice la propiedad DataGridViewCellEventArgs.RowIndex del evento para averiguar en qué fila se hizo clic.

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) 
  // Ignore clicks that are not in our 
  if (e.ColumnIndex == dataGridView1.Columns["MyButtonColumn"].Index && e.RowIndex >= 0) 
    Console.WriteLine("Button on row 0 clicked", e.RowIndex);
  

encontrado aquí: evento de clic de botón en datagridview

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *