martes, 9 de octubre de 2007

Responder a eventos de CheckBox dentro de controles ASP.NET

Al hilo del comentario de Alex en el artículo anterior, explicaré cómo podemos hacer lo mismo que se explicaba en dicho artículo, si nuestro botón pasa a ser un CheckBox.
La verdad, no conocía la respuesta... Pero ahora ya sí!

Si necesitamos que un GridView contenga un CheckBox y que se realice una acción cada vez que éste se seleccione o se deseleccione, sencillamente tendremos que crear un método que responda a dicha acción y asociar el CheckBox a dicho método.
Por ejemplo:

<asp:TemplateField HeaderText="Total">
<ItemTemplate>
<asp:CheckBox Id="CheckBox1" runat="server" OnCheckedChanged="CheckBox1_CheckedChanged1" AutoPostBack="true"></asp:CheckBox>
</ItemTemplate>
</asp:TemplateField>


El .cs asociado tendría un método:

protected void CheckBox1_CheckedChanged1(object sender, EventArgs e)
{
//Código asociado
}


Pero, de esta forma no podemos acceder a las propiedades de la fila en la que nos encontramos.

Para ello, tendríamos que añadir unas cositas en el código asociado al CheckBox, de forma que podamos saber en qué fila nos encotramos y, una vez hecho esto, poder acceder a una de las columnas.
El código que habría que incluir en dicho método sería:

protected void CheckBox1_CheckedChanged1(object sender, EventArgs e)
{
CheckBox checkbox = (CheckBox)sender;
GridViewRow row = (GridViewRow)checkbox.NamingContainer;
//Todo lo que queramos hacer aquí
}


Como vemos, lo primero que hacemos es obtener el CheckBox que ha invocado al método.
Una vez lo hemos hecho, podemos conocer el contenedor de dicho objeto, con lo que conoceríamos la fila del GridView que contiene el CheckBox que ha sido seleccionado/deseleccionado y, con ella, todos los valores de sus columnas.

Pero este método no sólo sirve para CheckBoxes. En realidad sirve para cualquier control, por ejemplo un Button.
Es decir, podemos hacer lo mismo que explicamos en el artículo anterior de esta forma.
Lo que tendríamos que hacer es añadir el evento "OnClick" al Button y asociarle el método correspondiente (por ejemplo "Button1_Click") y en dicho método, poner el mismo código que arriba, pero referente a un Button:

protected void button1_Click(object sender, EventArgs e)
{
Button button = (Button)sender;
GridViewRow row = (GridViewRow)button.NamingContainer;
//Código que queramos
}


Espero que os sirva de ayuda!

Saludos!