viernes, 8 de junio de 2012

Problemas al acceder al valor de un GridView Edit Template ASP.NET

Cuando intentamos acceder a un valor de un GridView cuando usamos Edit Templates, tenemos que tener en cuenta la forma en que lo hacemos vamos ha ver un ejemplo:

<asp:TemplateField HeaderText="Cantidad">
                                        <ItemTemplate>
                                            <%# Eval("pr_PreciosListaPrecios")%>
                                    </ItemTemplate>
                                        <EditItemTemplate>
                                            <asp:TextBox ID="txtCantidad" runat="Server"  Text='<%# Bind("pr_PreciosListaPrecios") %>'  Width="90px"></asp:TextBox>
                                        <%--Text='<%# Eval("pr_PreciosListaPrecios") %>'--%>
                                       
                                        </EditItemTemplate>
                                        <HeaderStyle HorizontalAlign="Left" />
                                        <%-- <ItemStyle Width="25%" />--%></asp:TemplateField>

Si cargamos de esta manera el GridView, habria un Problema ya que no podriamos acceder al valor del ItemTemplate, la razón es sencilla, es porque no estamos especificando explicitamente lo que ASP, va ha convertir en tiempo de ejecucion, por lo tanto no podriamos acceder al valor e esta manera,

GridView.oRows[Index].Cells[3].Text;

La Solucion :

<asp:TemplateField HeaderText="Cantidad">
                                        <ItemTemplate>
                                            <%--<%# Eval("pr_PreciosListaPrecios")%>--%>
                                        <asp:Label ID="lblCantidadLista" runat="server" Text='<%# Bind("pr_PreciosListaPrecios") %> '></asp:Label>                                                
                                        </ItemTemplate>
                                        <EditItemTemplate>
                                            <asp:TextBox ID="txtCantidad" runat="Server"  Text='<%# Bind("pr_PreciosListaPrecios") %>'  Width="90px"></asp:TextBox>
                                        <%--Text='<%# Eval("pr_PreciosListaPrecios") %>'--%>
                                       
                                        </EditItemTemplate>
                                        <HeaderStyle HorizontalAlign="Left" />
                                        <%-- <ItemStyle Width="25%" />--%></asp:TemplateField>


Cambiamos la forma de cargar los datos indicando a la Propiedad , haciendole un "Bind" a un label , que en tiempo de ejecucion asp lo reconoce explicitamente como un "span",  cosa que podriamos acceder al vaor sin ningun problema de la iguiente manera:

foreach (GridViewRow oRows in gridDetalle2.Rows) {

Label lblCantidadLista = oRows.Cells[3].FindControl("lblCantidadLista") as Label;

}

y obtenemos el valor sin ningun problemas,


Saludos,

7 comentarios:

  1. Hola.
    Cómo seria para acceder al valor con vb.net?
    Saludos

    ResponderEliminar
    Respuestas

    1. Para esos casos te recomiendo que manejes objetos y List Object2

      El ListObject2 cargaria tu grid

      algo asi


      List Object2 oListaVariable =new List Object2 ()

      grid.datasource = oListaVariable
      grid.databind()


      ahora en tienes que desencadenar un evento de la primera grilla algo asi


      protected void QuitarItem_Command(object sender, System.Web.UI.WebControls.CommandEventArgs e)
      {
      int item = Convert.ToInt32(e.CommandArgument);


      /*Aqui invocas a tu otro grilla*/

      }

      Eliminar
  2. Hola, seria lo mismo , solo varia en el lado del servidor seria algo asi

    GridView.oRows(Index).Cells(3).Text

    For Each oRows As GridViewRow In gridDetalle2.Rows


    Dim lblCantidadLista As Label = TryCast(oRows.Cells(3).FindControl("lblCantidadLista"), Label)
    Next

    ResponderEliminar
  3. HOLA, COMO SERIA PARA PASAR DE UN GRID A OTRO SIENDO QUE EL SEGUNDO ESTA EN FORMA DE EDICION? AYUDA POR FAVOR!

    ResponderEliminar