GridView: acceder a los valores de las columnas no visibles

6. December 2009 15:26 by Oscar.SS in Desarrollo .NET, Desarrollo Web  //  Tags: ,   //   Comments (0)

Cuando intentamos acceder al valor de una celda, de una columna marcada en el GridView como no visible, nos encotramos ante un problema. Dado que, normalmente las columnas marchadas como no visibles, suelen almacenar datos nada importantes para el usuario (id, codigos, valores ocultos, etc) pero si de suma importancia para el funcionamiento interno de nuestra aplicación.

Por lo tanto, lógicamente el siguiente intento no nos devolverá nada porque la columna no visible no ha sido "pintada".

string id gvEmpleados.Rows[e.RowIndex].Cells[celdaId].Text;

Para resolver este pequeño problema debemos utilizar las propiedades DataKayNames y Datakeys del GridView. Veamos un ejemplo.

Tenemos el siguiente XML que deseamos mostrar por pantalla al usuario por medio de una rejilla como GridView.

<?xml version="1.0" encoding="utf-8"?>
<empleados>
    
<empleado id="1" idEmpresa="034/9435" Nombre="Pedro" Telefono="985945452" Pais="Mexico" />
    <
empleado id="2" idEmpresa="035/3245" Nombre="Antonio" Telefono="887404730" Pais="Perú" />
    <
empleado id="3" idEmpresa="078/4324" Nombre="Jorge" Telefono="9149858353" Pais="España" />
    <
empleado id="4" idEmpresa="045/3243" Nombre="Elena" Telefono="893737581" Pais="Argentina" />
    <
empleado id="5" idEmpresa="074/5425" Nombre="Raquel" Telefono="9984573423" Pais="España" />
</
empleados> 

Nuestro GridView tendrá la siguiente definición de código HTML en nuestra página.

 

<asp:GridView ID="gvEmpleados" runat="server" AutoGenerateColumns="False" 
            DataSourceID
="XmlDataSourceEmpleados" DataKeyNames="id,idEmpresa" 
            onrowdeleting
="gvEmpleados_RowDeleting" 
            onselectedindexchanging
="gvEmpleados_SelectedIndexChanging">
            
<Columns>
                
<asp:CommandField ShowSelectButton="True" />
                <
asp:BoundField DataField="id" HeaderText="id" SortExpression="id" 
                    Visible
="False" />
                <
asp:BoundField DataField="idEmpresa" HeaderText="idEmpresa" 
                    SortExpression
="idEmpresa" Visible="False" />
                <
asp:BoundField DataField="Nombre" HeaderText="Nombre" 
                    SortExpression
="Nombre" />
                <
asp:BoundField DataField="Telefono" HeaderText="Telefono" 
                    SortExpression
="Telefono" />
                <
asp:BoundField DataField="Pais" HeaderText="Pais" SortExpression="Pais" />
                <
asp:CommandField ShowDeleteButton="True" />
            </
Columns>
        
</asp:GridView>
        
<asp:XmlDataSource ID="XmlDataSourceEmpleados" runat="server" 
            DataFile
="~/App_Data/empleados.xml"></asp:XmlDataSource>
He marcado en negrita y un poco más grande las columnas no visibles al usuario. También podemos ver la propiedad DataKeyNames. Esta propiedad permite establecer (también recuperar) una colección de columnas que serán tratadas como claves primarias del origen de datos.
 
Ahora solo nos queda desde código acceder a estos valores cuando el usuario dispare cualquiera de los eventos del GridView. Ya sea para actualizar, eliminar, seleccionar, etc una fila. Un par de ejemplos:
 
 
    protected void gvEmpleados_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
    {
        var colsNoVisible 
gvEmpleados.DataKeys[e.NewSelectedIndex].Values;
        string 
id (string)colsNoVisible[0];
        string 
idEmpresa (string)colsNoVisible[1];
    
}
    
protected void gvEmpleados_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        var colsNoVisible 
gvEmpleados.DataKeys[e.RowIndex].Values;
        string 
id (string) colsNoVisible[0];
        string 
idEmpresa (string) colsNoVisible[1];
    
}

La propiedad DataKeys nos permite acceder a las columnas que son tratadas como claves primarias en el origen de datos. De esta forma nosotros podemos trabajar por debajo con registros únicos como ids y mostrar al usuario solo la información que le interesa.

 

Recent Comments

Comment RSS

Month List