Estoy desarrollando una aplicación de Windows usando C #. Estoy usando DataGridView
para mostrar datos. He agregado una columna de botón en eso. Quiero saber cómo puedo manejar el evento de clic en ese botón en DataGridView.
c#
.net
winforms
datagridview
Himadri
fuente
fuente
Respuestas:
Agregó un botón a su
DataGridView
y desea ejecutar un código cuando se hace clic.Fácil, solo sigue estos pasos:
No hacer:
Primero, esto es lo que NO debes hacer:
Evitaría las sugerencias en algunas de las otras respuestas aquí e incluso las que proporciona la documentación de MSDN para codificar el índice o el nombre de la columna para determinar si se hizo clic en un botón. El evento click 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 o índice de columna 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 se disparará:... pero también se disparará cada vez que se haga clic en el encabezado de la fila . Esto requiere agregar código adicional simplemente para determinar si el
e.RowIndex
valor es menor que 0En su lugar, maneje lo
CellContentClick
que solo ocurre:Por alguna razón, el encabezado de la columna también se considera 'contenido' dentro de una celda, por lo que aún tendremos que verificarlo a continuación.
Dos:
Entonces, esto es lo que debes hacer:
Primero, envíe 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 hacer que agregar o quitar controladores sea complicado.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 de tipo
DataGridViewButtonColumn
. Debido a que ya enviamos al remitente a escribirDataGridView
, podemos obtener laColumns
colección y seleccionar la columna actual usandoe.ColumnIndex
. Luego verifique si ese objeto es de tipoDataGridViewButtonColumn
.Por supuesto, si necesita distinguir entre varios botones por cuadrícula, puede seleccionar según el nombre de la columna o el índice, pero esa no debería ser su primera comprobación. Siempre asegúrese de hacer clic primero en un botón y luego maneje cualquier otra cosa de manera apropiada. En la mayoría de los casos en los que solo tiene un solo botón por cuadrícula, puede saltar directamente a las carreras.
Poniendolo todo junto:
C # :
VB :
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 DataGrid. No puede agregarlo a DataGrid en sí, sin desordenarse 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 lo bueno es que ha separado lo que quiere hacer cuando se hace clic en un botón con la forma de determinar si se hizo clic en un botón.
Simplemente declare un evento, créelo cuando sea apropiado y manejelo. Se verá así:
Actualización 2 - Cuadrícula extendida
Lo que sería genial es si estuviéramos trabajando con una grilla que acaba de hacer estas cosas por nosotros. Podríamos responder a la pregunta inicial fácilmente:
you've added a button to your DataGridView and you want to run some code when it's clicked
. Aquí hay un enfoque que extiende elDataGridView
. Puede que no valga la pena 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.Simplemente agregue esto a su ensamblaje:
Eso es. Nunca lo toques de nuevo. Asegúrese de que su DataGrid sea del tipo
DataGridViewExt
que debería funcionar exactamente igual que un DataGridView. Excepto que también generará un evento adicional que puedes manejar así:fuente
TypeOf senderGrid.Rows(e.RowIndex).Cells(e.ColumnIndex) Is DataGridViewButtonCell
public class DataGridViewExt : DataGridView { public event DataGridViewCellEventHandler CellButtonClick; public DataGridViewExt() { this.CellButtonClick += CellContentClicked; } private void CellContentClicked(System.Object sender, DataGridViewCellEventArgs e) { if (this.Columns[e.ColumnIndex].GetType() == typeof(DataGridViewButtonColumn) && e.RowIndex >= 0 ) { CellButtonClick.Invoke(this, e); } } }
Eso se responde completamente aquí para WinForms: DataGridViewButtonColumn Class
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 ...)
fuente
dataGridView1_CellClick
ese código. ¿Puedes actualizar tu respuesta y darme una descripción?Aquí está la mejor respuesta:
No puede implementar un evento de botón para celdas de botón en un DataGridViewButtonColumn. En su lugar, utiliza el evento CellClicked de DataGridView y determina si el evento se activó para una celda en su DataGridViewButtonColumn. Use la propiedad DataGridViewCellEventArgs.RowIndex del evento para averiguar en qué fila se hizo clic.
encontrado aquí: evento de clic de botón en datagridview
fuente
Esto resuelve mi problema.
fuente
Un poco tarde para la tabla aquí, pero en c # (vs2013) tampoco necesita usar nombres de columna, de hecho, gran parte del trabajo adicional que algunas personas proponen es completamente innecesario.
La columna se crea realmente como un miembro del contenedor (el formulario o control de usuario en el que ha puesto el DataGridView). Desde el código del diseñador (las cosas que no debes editar excepto cuando el diseñador rompe algo), verías algo como:
...
...
Entonces, en el controlador CellContentClick, además de asegurarse de que el índice de la fila no sea 0, solo debe verificar si la columna en la que se hizo clic es la que desea mediante la comparación de referencias de objetos:
Tenga en cuenta que la belleza de esto es que cualquier cambio de nombre será captado por el compilador. Si indexa con un nombre de texto que cambia, o que capitaliza incorrectamente, está obligado a problemas de tiempo de ejecución. Aquí realmente usa el nombre de un objeto, que el diseñador crea en función del nombre que proporcionó. Pero cualquier compilación le indicará el compilador.
fuente
Aquí está mi fragmento de código para activar el evento de clic y pasar el valor a otro formulario:
fuente
Suponiendo, por ejemplo, que las
DataGridView
columnas se muestran a continuación y que sus elementos enlazados a datos son del tipoPrimalPallet
que puede usar, la solución se proporciona a continuación.Es más seguro columnas de acceso directamente en lugar de utilizar
dataGridView1.Columns["MyColumnName"]
y no hay necesidad de analizarsender
a laDataGridView
ya que no es necesario.fuente
bien, voy a morder.
tendrás que hacer algo como esto, obviamente es todo metacódigo.
que "engancha" el método IClicked_My_Button_method hasta el evento Click del botón. Ahora, cada vez que el evento se "dispara" desde la clase de propietarios, nuestro método también se disparará.
En el método IClicked_MyButton_, simplemente coloca lo que quieras que suceda al hacer clic en él.
Los detalles reales aquí dependen de usted, pero si falta algo más conceptualmente, hágamelo saber y trataré de ayudarlo.
fuente
La solución más votada es incorrecta, ya que no puede funcionar con pocos botones en una fila.
La mejor solución será el siguiente código:
fuente
simplemente agregue el
ToList()
método al final de su lista, donde se une a datagridview DataSource:fuente
Puede probar este, no le importaría mucho el orden de las columnas.
fuente
Por ejemplo para ClickCell Event en Windows Forms.
Saludos :)
fuente
En caso de que alguien esté usando C # (o vea la Nota sobre VB.NET a continuación) y haya llegado a este punto, pero todavía está atascado, siga leyendo.
La respuesta de Joshua me ayudó, pero no del todo. Notarás que Peter preguntó "¿De dónde obtendrías el botón?", Pero no recibió respuesta.
La única forma en que funcionó para mí fue hacer una de las siguientes acciones para agregar mi controlador de eventos (después de configurar DataSource de DataGridView en mi DataTable y después de agregar DataGridViewButtonColumn a DataGridView):
Ya sea:
o:
Y luego agregue el método del controlador (ya sea dataGridView1_CellClick o dataGridView1_CellContentClick) que se muestra en las diversas respuestas anteriores.
Nota: VB.NET es diferente de C # a este respecto, porque simplemente podemos agregar una cláusula Handles a la firma de nuestro método o emitir una declaración AddHandler como se describe en el documento de Microsoft " Cómo: llamar a un controlador de eventos en Visual Basic "
fuente
Agregará una columna de botón como esta en su dataGridView
Luego puede agregar algunas acciones dentro del evento de clic de celda. Encontré que esta es la forma más fácil de hacerlo.
Descubrí que el evento Cell Click se suscribe automáticamente a menudo. Entonces no necesitaba este código a continuación. Sin embargo, si su evento de clic en la celda no está suscrito, agregue esta línea de código para su dataGridView.
fuente