jueves, 1 de julio de 2010

GridView, onclick condicionales.

Gabriela me solicita una ayudita en relación al post Seleccionar por filas de un GridView y esto me da para un post sobre cómo tratar de forma condicional diferentes eventos de click en un mismo GridView.

Es decir, tener dos columnas del grid que tienen botones (o combos en el caso de gabriela)  y que la aplicación sepa que hacer en cada caso.

Para ello lo primero es entender que todo lo que ocurre en un GridView lanza el evento GridViewCommand. Aprovechándonos de ello declaramos en nuestro Grid una columnas con un botón en donde definiremos el comando que queremos invocar.
<asp:TemplateField>
<ItemTemplate>
<asp:ImageButton ID="imgbSeleccionar" runat="server" CausesValidation="false"
        CommandName="Seleccionar" 
        CommandArgument='<%# Eval("id")%>' 
        ImageUrl="~/imagenes/icon_06.png" ToolTip="Seleccionar." />
</ItemTemplate>
</asp:TemplateField>

Lo importante de este código son dos partes. Por un lado el CommandName que el que le va indicar al evento RowCommand el tipo de acción que hemos lanzado. (Acordaros de usar una nomenclatura clara y autoreferente).

Y por otro lado el CommandArgument que es en donde le vamos a mandar la información necesaria para realizar la acción que hemos lanzado.

En el código tendremos el evento RowCommand en donde capturaremos el CommandName y así tendremos la acción lanzada:


public void Grid_RowCommand(object sender, GridViewCommandEventArgs e)
{
switch (e.CommandName)
{
case "Seleccionar":
id = e.CommandArgument.ToString();
SeleccionaObjeto(id);
break;
default:
break;
}
}



Seguro ya os habréis dado cuenta que con este sistema puedes tener todas las acciones que se te ocurran, he incluso varias acciones en una misma columna.

Es importante recordar que existen tres acciones predefinidas que son: “Select”, “Edit” y “Delete” y que si usáis estos CommandName, deberéis gestionarlos en sus respectivos eventos u os dará un bonito error.

En resumen, Gabriela, espero que te haya sido de ayuda.

No hay comentarios: