none
Al eliminar fila GridView me aparecere "referencia a objeto no establecida como instancia de un objeto." RRS feed

  • Pregunta

  • Hola foro, gracias de antemano por las respuestas.

    tengo mi grilla.

    <asp:GridView ID="GvListado" runat="server" CellPadding="4" DataKeyNames="Cod" ForeColor="#333333" GridLines="None" Font-Names="Tahoma" Font-Size="X-Small" AutoGenerateColumns="False">
            <AlternatingRowStyle BackColor="White" />
            <Columns>
                <asp:TemplateField HeaderText="CODIGO" >
                    <ItemTemplate>
                        <asp:TextBox ID="Cod" runat="server"  Enabled="false" Width="140" ></asp:TextBox>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="DESCRIPCION">
                     <ItemTemplate>
                        <asp:TextBox ID="Desc" runat="server" Enabled="false" Width="280"></asp:TextBox>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Cant">
                     <ItemTemplate>
                        <asp:TextBox ID="Cant" runat="server" Enabled="false" Width="60"></asp:TextBox>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="P Unit. Compra">
                    <ItemTemplate>
                        <asp:TextBox ID="tbPUnitCompra" runat="server" commandName="Actualizar" Width="60" >0.00</asp:TextBox>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="P Unit. Venta">
                    <ItemTemplate>
                        <asp:TextBox ID="tbPUnitVenta" runat="server" Width="60">0.00</asp:TextBox>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="P Total Venta">
                    <ItemTemplate>
                        <asp:TextBox ID="tbPTotalVenta" runat="server" Width="60">0.00</asp:TextBox>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:Button ID="EliminarFila" runat="server" Text="Eliminar" Width="70" CommandName="Delete" />
                    </ItemTemplate>
                </asp:TemplateField>
                
            </Columns>
            <EditRowStyle BackColor="#2461BF" />
            <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
            <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
            <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
            <RowStyle BackColor="#EFF3FB" />
            <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
        </asp:GridView>


    tengo el siguiente codigo en el RowCommand del Grid

    If e.CommandName = "Delete" Then
                    Dim gvr As GridViewRow = DirectCast(DirectCast(e.CommandSource, Button).NamingContainer, GridViewRow)
                    Dim RemoveAt As Integer = gvr.RowIndex
                    dtCurrentTable = DirectCast(ViewState("Products"), DataTable)
                    dtCurrentTable.Rows.RemoveAt(RemoveAt) <<<<<<< ERROR: referencia a objeto no establecida como instancia de un objeto.
                    dtCurrentTable.AcceptChanges()
                    ViewState("Products") = dtCurrentTable
                End If

    En la linea marcada es donde me aparece el error.

    Uso esta funcion para llenar la grilla por un boton "Agregar"

    Private Sub AddNewRowToGrid()
    
            If ViewState("CurrentTable") IsNot Nothing Then
    
    
                dtCurrentTable = DirectCast(ViewState("CurrentTable"), DataTable)
                Dim drCurrentRow As DataRow
    
                drCurrentRow = Nothing
                Dim i As Integer
                If dtCurrentTable.Rows.Count > 0 Then
    
                    For i = 0 To dtCurrentTable.Rows.Count
                    Next
                    drCurrentRow = dtCurrentTable.NewRow()
    
                    dtCurrentTable.Rows(i - 2)("Cod") = Session("IdArticulo").ToString
                    dtCurrentTable.Rows(i - 2)("DESCRIPCION") = Session("articulo").ToString
                    dtCurrentTable.Rows(i - 2)("Cant") = Format(Val(Val(Session("camtidad").ToString)), paramdecimales)
                    dtCurrentTable.Rows(i - 2)("PUCOMPRA") = Format(0, paramdecimales)
                    dtCurrentTable.Rows(i - 2)("PUVENTA") = Format(Val(Session("PrecioV1")), paramdecimales)
                    dtCurrentTable.Rows(i - 2)("PTVENTA") = Format((Val(Session("camtidad")) * Val(Session("PrecioV1"))), paramdecimales).ToString
                    dtCurrentTable.Rows.Add(drCurrentRow)
                    ViewState("CurrentTable") = dtCurrentTable
    
                    GvListado.DataSource = dtCurrentTable
                    GvListado.DataBind()
                End If
    
            Else
    
                Response.Write("ViewState is null")
    
            End If



    Luis Vizcarra

    lunes, 15 de junio de 2015 17:44

Respuestas

  • hola

    es que no puedes eliminar por el index, tienes que eliminar por el valor

    no se si usas el DataKeyNames para indicar un id o codigo de la entidad

    Dim Id As Integer = Convert.ToInt32(GridView1.DataKeys(gvr.RowIndex).Value)
    
    Dim row As DataRow = dt.Find(string.Format("Id={0}", id))
    
    If row IsNot Nothing Then
    
        dtCurrentTable.Rows.Remove(row);
    
    End If

    como veras debes buscar el valor no un index, este no es confiable

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Luis Vizcarra lunes, 15 de junio de 2015 18:30
    lunes, 15 de junio de 2015 17:53

Todas las respuestas

  • hola

    es que no puedes eliminar por el index, tienes que eliminar por el valor

    no se si usas el DataKeyNames para indicar un id o codigo de la entidad

    Dim Id As Integer = Convert.ToInt32(GridView1.DataKeys(gvr.RowIndex).Value)
    
    Dim row As DataRow = dt.Find(string.Format("Id={0}", id))
    
    If row IsNot Nothing Then
    
        dtCurrentTable.Rows.Remove(row);
    
    End If

    como veras debes buscar el valor no un index, este no es confiable

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Luis Vizcarra lunes, 15 de junio de 2015 18:30
    lunes, 15 de junio de 2015 17:53
  • Gracias por la respuesta.

    me sigue saliendo el mismo error, nose donde me estoy equivocando

     If e.CommandName = "Delete" Then
                    Dim gvr As GridViewRow = DirectCast(DirectCast(e.CommandSource, Button).NamingContainer, GridViewRow)
                    dtCurrentTable = DirectCast(ViewState("Products"), DataTable)
                    Dim Id As Integer = Convert.ToInt32(GvListado.DataKeys(gvr.RowIndex).Value)
                    Dim row As DataRow = dtCurrentTable.Rows.Find(String.Format("Id={0}", Id))
                    If row IsNot Nothing Then
                        dtCurrentTable.Rows.Remove(row)
                    End If
                    ViewState("Products") = dtCurrentTable
                End If



    Luis Vizcarra

    lunes, 15 de junio de 2015 18:31
  • hola

    pero estas definiendo el DataKeyNames en el gridview ?

    porque sino el DataKeys() va a fallar

    ----

    en que evento pones este codigo ? no usas el RowComand, porque si es asi no veo para que aplicas el NamingContainer

    si podrias usar 

    [ASP.NET][GridView] - Como seleccionar una fila


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    lunes, 15 de junio de 2015 18:37
  • hola,

    Si, he agregado una columna para dar referencia al indice, y esa columna la he puesto de DataKeyNames en el Grid

    el error me sale en la sgt linea:

    Dim row As DataRow = dtCurrentTable.Rows.Find(String.Format("Id={0}", Id))


    Luis Vizcarra

    lunes, 15 de junio de 2015 18:43
  • Uso el evento RowCommand, no se programar muy bien en asp.net asi que ese codigo lo copie.

    Protected Sub GvListado_RowCommand(sender As Object, e As GridViewCommandEventArgs) Handles GvListado.RowCommand
            Try
                If e.CommandName = "Delete" Then
                    Dim gvr As GridViewRow = DirectCast(DirectCast(e.CommandSource, Button).NamingContainer, GridViewRow)
                    
                    Dim Id As Integer = Convert.ToInt32(GvListado.DataKeys(gvr.RowIndex).Value)
                    Dim row As DataRow = dtCurrentTable.Rows.Find(String.Format("Id={0}", Id))
                    If row IsNot Nothing Then
                        dtCurrentTable.Rows.Remove(row)
                    End If
                    ViewState("Products") = dtCurrentTable
                End If
                
            Catch ex As Exception
                Throw
            End Try
        End Sub


    Luis Vizcarra

    martes, 16 de junio de 2015 15:04