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