jueves, 6 de septiembre de 2007

Responder a eventos de botones dentro de controles ASP.NET

En ocasiones necesitamos que en la plantilla de un elemento de un control haya un botón con alguna funcionalidad.

Podemos pensar que esto es tan sencillo como introducir el botón en dicha plantilla en el lugar que queremos y asignarle un evento en su propiedad OnClick. En algunas ocasiones puede serlo (así de fácil), pero en otras podemos necesitar algunas funcionalidades adicionales que no tendríamos de esta forma, o al menos no las tendríamos de forma sencilla.

Por ejemplo, imaginaos que tenemos un gridview con varias columnas, una de las cuales el un entero que va de 1 a 10. Imaginad que queremos introducir un botón que nos permita modificar dicho entero de forma que se le reste 1 a la cantidad que haya en ese momento en dicha fila, siempre que esta sea mayor a 1.
Pues bien, en este caso tendríamos que acceder a un valor de una columna dentro de una fila del GridView. Y claro, cómo accedemos al valor de la fila en la que está el botón en cuestión... Y si no podemos acceder a la fila, ¿cómo accedemos a la columna?

Ya no parece tan fácil, verdad? Pues nada más lejos de la realidad.
Lo que tenemos que hacer es capturar el evento del botón en el método RowCommand y, una vez en él, actuar en función del botón que hemos pulsado.

Pero, ¿cómo sabemos qué botón hemos pulsado? No os preocupéis, esto es bastante sencillo. Sólo tenemos que fijar la propiedad CommandName del botón y luego acceder a ella para saber qué botón se ha pulsado...
Es un poco lioso de explicar y tal vez no haya quedado muy claro, así que pongamos un ejemplo.

Este ejemplo es el mismo con el que se explica esto en el MSDN de Microsoft y lo podéis encontrar aquí.

Aquí teneís los pasos:
  1. Insertemos un botón en el GridView con la propiedad CommandName="boton".
  2. Creamos el método RowCommand del gridview. En dicho método haremos lo siguiente:
    1. comprobar la propiedad CommandName para saber el botón que ha generado el evento
    2. realizar las acciones necesarias
Por ejemplo:
protected void GridView1_RowCommand(object source,
GridViewCommandEventArgs e)
{
if (e.CommandName == "boton")
{
// Aquí añadimos el código en respuesta al click en el botón
}
}
Como véis es bastante sencillo responder a los eventos de un botón que insertamos dentro de un ItemTemplate de un control. Fijaos que de esta forma estamos ejecutando un método al que hemos pasado un argumento del tipo GridViewCommandEventArgs, a partir del cual podemos acceder a las características y propiedades que necesitamos del gridview, como la fila que contiene el botón que ha generado el evento.

Por lo tanto, de esta forma, a diferencia que con el evento OnClick, podemos acceder a todo la información que podemos necesitar.

Espero que esto os sirva de ayuda.

Saludos!

2 comentarios:

alex dijo...

como le podemos hacer para agregar un checkbox.. y saber cuando le damos clic en el checkbox

Jaume Montesinos dijo...

Ale,

en primer lugar perdón por haber tardado tanto en contestar....
Si ya has solucionado la duda, siento haber tardado tanto. Y si no, espero que lo te ayude lo siguiente.
Para solucionar esto, es necesario hacer algo un pelín diferente, así que, si no te importa lo explico en otro artículo (el siguiente).

Un saludo y muchas gracias!