¿Cómo seleccionar una fila en un Gridview en ASP NET?
El ejemplo siguiente se trabaja sobre Visual Studio 2012 pero el código utilizado es compatible con versiones anteriores probados hasta Visual Studio 2005.
En este tema aprenderemos a realizar la selección de filas en un control Gridview sin incorporar textos de selección o botones, simplemente presionando clic sobre la fila. Para esto nos apoyaremos de nuestra entrada anterior Llenar control Gridview en ASP NET.
Tomaremos en cuenta que el nombre de nuestro control Gridview es “GridViewOne”. Agregaremos en nuestro code behind el evento RowDataBound que se produce cuando una fila de datos se enlaza a los datos de un control GridView como en el siguiente ejemplo:
<div class="divGrid"> <div class="grid"> <asp:UpdatePanel ID="UpdatePanel" runat="server" UpdateMode="Conditional"> <ContentTemplate> <asp:GridView ID="GridViewOne" runat="server" CssClass="datatable" CellPadding="0" CellSpacing="0" GridLines="None" AutoGenerateColumns="False" DataKeyNames="codigo"> <RowStyle CssClass="even"/> <HeaderStyle CssClass="header" /> <AlternatingRowStyle CssClass="odd"/> <Columns> <asp:BoundField HeaderText="Código de Empleado" DataField="codigo"/> <asp:BoundField HeaderText="Nombre y Apellido" DataField="Nombre_Empleado"/> </Columns> </asp:GridView> <asp:HiddenField ID="hdfValorGrid" runat="server" Value=""/> </ContentTemplate> </asp:UpdatePanel> </div><!-- grid --> </div><!-- divGrid --> |
La consulta que llenara nuestro origen de datos debe ser algo como lo siguiente
Dim dbCon As New System.Data.OleDb.OleDbConnection("CADENA DE CONEXION HACIA SQL SERVER") dbCon.Open() Dim SQL As String = String.Empty SQL = "Select codigo, Nombre_Empleado from Empleados" Dim da As New System.Data.OleDb.OleDbDataAdapter(SQL, dbCon) |
Como se puede apreciar las columnas de las consultas coinciden con los atributos DataField de los objetos BoundField que conforman las columnas del control Datagridview; a su vez el atributo DataKeyNames debe tener como valor la llave primaria del origen de dato.
Una vez tenemos clara la relación que debe existir entre los objetos BoundField y nuestro origen de datos es momento de colocar el evento RowDataBound.
Protected Sub GridViewOne_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridViewOne.RowDataBound If e.Row.RowType = DataControlRowType.DataRow Then e.Row.Attributes.Add("OnClick", "" & Page.ClientScript.GetPostBackClientHyperlink(Me.GridViewOne, "Select$" + e.Row.RowIndex.ToString) & ";") End If End Sub |
Lo que se hace con el código anterior es insertar una funcionalidad en el Gridview de tal forma que al presiona clic sobre cualquier fila, esta sea seleccionada y cargue como valor por defecto el marcado en el atributo DataKeyNames.
Lo restante es pasar la información del Gridview hacia otro control, en este caso el control HiddenField, esto lo lograremos mediante el evento SelectedIndexChanged el cual se produce cuando se selecciona una fila en el Gridview.
Protected Sub GridViewOne_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridViewOne.SelectedIndexChanged Me.hdfValorGrid.Value = Me.GridViewOne.SelectedValue.ToString End Sub |
Espero les sea de utilidad, pueden colocar cualquier duda en la caja de comentarios, en próximos temas estaremos hablando de otras funcionalidades que podemos realizar con este poderoso control.
[…] Lo anteriormente dicho es bastante sencillo de hacer y no necesitamos (como en el caso anterior) configurar el atributo DataKeyNames del gridview, simplemente una vez habilitada la marcación o selección de la fila hay que escribir lo siguiente en el evento SelectedIndexChanged o cualquier otro evento de otro control de servidor que genere un postback… Sigue Leyendo […]
que tal amigo, seguí tus pasos pero nada no dispara el evento me podrías ayudar con eso por cierto estoy programando con Visual Studio 2012
Hola Gerson, en tu webform dentro del marcado <%@ Page debes agregar el atributo EnableEventValidation=»false» para que te deje trabajar con el ajax y javascript dentro de los controles de formulario. Haz la prueba y me comentas si te funciono.
Muy bien eso era , muchas gracias
Hola:
Me funciona muy bien lo que has publicado pero tengo una situacion un poco distinta. yo tengo un grid con varios productos donde al seleccionar uno pasa hacia otra pagina con varias opciones para modificar dicho producto. de la forma que tu muestras eso me funciona perfecto. el problema es que para mi caso se pueden seleccionar varios productos para hacerles modificaciones en el mismo grid mediante un checkbox que le agregue, entonces si pongo el codigo para pasar a la otra pag en el evento del «SelectedIndexChanged» no me permite seleccionar varios. al dar clic sobre el primero me pasa directo hacia la otra pag. yo le agregue un linkbutton al grid para que me hiciera esto pero si doy clic en el no se ejecuta su evento, pasa directo al del «SelectedIndexChanged». de que forma podria hacer esto? no se si me explique bien. gracias de antemano.
Hola Jorge, gracias por escribirnos. En tu caso tendrias que habilitar la edición del Gridview, te recomiendo que en vez de utilizar <asp:BoundField /> utilices <asp:TemplateField />
<asp:TemplateField HeaderText="Nompre del Producto">
<ItemTemplate>
<asp:TextBox ID="txtgProducto" runat="server" Text='<%# Bind("Producto") %>’ MaxLength="100" ToolTip="Nombre de producto"></asp:TextBox>
</ItemTemplate>
<ItemStyle Width="160" />
</asp:TemplateField>
Con el TemplateField del grid podras construir tus controles como si de un formulario se tratara. Para mostrar la información de la base de datos utiliza el <%# Bind("Producto") %>
Hola, funciona perfecto. Pero manda un error al tener dos gridview. Que se puede hacer en ese caso?
Los eventos y procesos son individuales para cada Grid. Revisa tu código para verificar si es que estas ingresando en un solo evento.