jueves, 16 de mayo de 2013

Agregar un Botón con una función específica en un gridview en ASP.Net

Se me presentó la necesidad de tener un gridview con botones, de editar, seleccionar, eliminar y uno botón adicional que realizara otra función.

Primero declaramos nuestro gridview con las columnas que necesitamos y agregamos en un templateField el botón que necesitamos, en este ejemplo agrego 2 y agregamos en la definición del gridview la función OnRowCommand y le decimos que cree una nueva función para este evento.


  <asp:GridView ID="GridView1" runat="server" OnRowDeleting ="GridView1_RowDeleting" OnRowEditing ="GridView1_RowEditing" AutoGenerateColumns="False" OnRowUpdating="GridView1_RowUpdating" OnRowCancelingEdit ="GridView1_RowCancelingEdit"  OnRowCommand="GridView1_RowCommand">
                 <Columns>



   <asp:TemplateField HeaderText ="Preguntas"><ItemTemplate>
                              <asp:ImageButton ID="BTPreguntas" runat="server" CausesValidation="False"
                            CommandName="Select" ImageUrl="~/Imagenes/lapiz.png"  CommandArgument="<%# CType(Container, GridViewRow).RowIndex%>"/>
                            </ItemTemplate>
                    </asp:TemplateField>
                       
                    <asp:TemplateField HeaderText ="Temas"><ItemTemplate>
                              <asp:ImageButton ID="BtTemas" runat="server" CausesValidation="False"
                            CommandName="Select" ImageUrl="~/Imagenes/lapiz.png"  CommandArgument="<%# CType(Container,GridViewRow).RowIndex %>"/>
                            </ItemTemplate>
                    </asp:TemplateField>
                           

                          </Columns>
                     
                      </asp:GridView>

en Botón, le agregamos un CommandName, a este le podemos poner el nombre que deseemos, y agregamos tambien un CommandArgument en el cual  vamos a pasar el indice de la fila en la que se hizo click al botón con la siguiente instrucción "<%# CType(Container, GridViewRow).RowIndex%>"

Pasando a la parte del código en la función que se creo para el evento

 Protected Sub GridView1_RowCommand(sender As Object, e As GridViewCommandEventArgs)
Aquí se escribe el código de la función deseada
End Sub

Aquí podemos leer el CommandName que le pasamos con la instruccion e.CommandName

el CommandArgument con e.CommandArgument con el que podemos recuperar el indice de la fila para obtener algún identificador del registro que deseamos por ejemplo.

Dim etiqueta  As Label = GridView1.Rows(e.CommandArgument.ToString).Cells(0).FindControl("Id")
en mi caso tenía una etiqueta con un identificador, por lo que la instrucción de la fila superior me devuelve la etiqueta. en caso de que no tenga un control se puede recuperar el valor con un
GridView1.Rows(e.CommandArgument.ToString).Cells(0).text

También podemos obtener el identificador del botón que se presionó con e.CommandSource.id lo cual nos sirve para poder identificar el botón que se presionó en caso de que tengamos más de un botón creado de está manera. Así podemos programar diferentes funciones para cada botón.



3 comentarios:

  1. Lamentablemente no me funciona el e.CommandName cuando agrego un control Button (no un ButtonField) a un Ítem Template. ¿Cómo atrapar qué botón hizo click cuando tengo varios Button en un ItemTemplate?

    ResponderBorrar