none
No me refresca Gridview al eliminar una fila RRS feed

  • Pregunta

  • Buenas,

    Tengo un Gridview que voy llenando dinámicamente en tiempo real, según se va metiendo información en unos campos de pantalla. El caso es, que cuando elimino una fila del gridview, al volver a la pantalla me sigue apareciendo la línea eliminada. Utilizo un datatable para cargar el source del grid pero cada vez que se llama ala página se vacia, por ello, no es problema del datatable porque siempre está vacio. Me podríais ayudar, gracias de antemano. Un saludo

    Adjunto mando el HTML :

    <asp:GridView runat="server" BackColor="White" BorderColor="#999999"
                                        BorderStyle="None" BorderWidth="1px" CellPadding="0" GridLines="None"
                                        Width="849px" ID="GDTABLA" AutoGenerateColumns="False" Height="80px"
                                        OnSelectedIndexChanged="GDTABLA_SelectedIndexChanged"
                                        OnRowDeleting="GDTABLA_RowDeleting">
                                    <Columns>
                                        <asp:TemplateField HeaderText="Editar">
                                            <ItemTemplate>
                                                <asp:ImageButton ID="imgEditar" runat="server" CommandName="select" ImageUrl="Images/Edit.gif" />
                                            </ItemTemplate>
                                        </asp:TemplateField>
                                        <asp:TemplateField HeaderText="Eliminar">
                                            <ItemTemplate>
                                                <asp:ImageButton ID="imgEliminar" runat="server" CommandName="delete"  ImageUrl="Images/Delete.gif" />
                                            </ItemTemplate>
                                        </asp:TemplateField>
                                        <asp:BoundField HeaderText="Código error" DataField="codigo" />
                                        <asp:BoundField HeaderText="Mensaje de error" DataField="castellano" />                                   
                                    </Columns>
                                    <HeaderStyle BackColor="#990099" ForeColor="White" Font-Size="Small" Height="30px" />
                                    <RowStyle BackColor="White" ForeColor="Black" />
                                    <SelectedRowStyle BackColor="#999999" />
                                </asp:GridView>

    y el codehind:

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            CrearTablas()
           
            MultiView1.ActiveViewIndex = 0
          
            lblCodError.Visible = False
                lblMsgErrorCas.Visible = False
                lblComentario.Visible = False
                txtCodError.Visible = False
                txtMsgErrorCas.Visible = False
                ComentarioSolicitante.Visible = False

        End Sub

        Private Sub CrearTablas()
            oDT = New Data.DataTable
            Dim oCol As Data.DataColumn
            oCol = New Data.DataColumn("codigo")
            oDT.Columns.Add(oCol)
            oCol = New Data.DataColumn("castellano")
            oDT.Columns.Add(oCol)
        End Sub

    Protected Sub cmdSalvar_Click(sender As Object, e As System.EventArgs) Handles cmdSalvar.Click
    AñadirLinea()
               End Sub
    Private Sub AñadirLinea()
            Dim oRow As DataRow
            'Si ya tiene datos el grid, primero relleno en la datatable los que ya existen
            If GDTABLA.Rows.Count > 0 Then
                For i As Integer = 0 To GDTABLA.Rows.Count - 1
                    oRow = oDT.NewRow()
                    oRow.Item("codigo") = GDTABLA.Rows(i).Cells(2).Text.ToUpper
                    oRow.Item("castellano") = GDTABLA.Rows(i).Cells(3).Text.ToUpper
                    oDT.Rows.Add(oRow)
                Next
            End If
            oRow = oDT.NewRow()
            oRow.Item("codigo") = txtCodError.Text.ToUpper
            oRow.Item("castellano") = txtMsgErrorCas.Text.ToUpper
            oDT.Rows.Add(oRow)
            GDTABLA.DataSource = oDT
            GDTABLA.DataBind()

        End Sub

        Protected Sub GDTABLA_RowDeleting(sender As Object, e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles GDTABLA.RowDeleting
            Dim oRow As DataRow
            Try
                For i As Integer = 0 To GDTABLA.Rows.Count - 1
                    If Not e.RowIndex.Equals(i) Then
                        oRow = oDT.NewRow()
                        oRow.Item("codigo") = GDTABLA.Rows(i).Cells(2).Text.ToUpper
                        oRow.Item("castellano") = GDTABLA.Rows(i).Cells(3).Text.ToUpper
                        oDT.Rows.Add(oRow)
                    End If

                Next

                Me.GDTABLA.DataSource = oDT
                Me.GDTABLA.DataBind()

            Catch ex As Exception

            End Try

            cmdSalvar.Enabled = False
        End Sub

        Protected Sub GDTABLA_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles GDTABLA.SelectedIndexChanged
            txtCodError.Text = GDTABLA.SelectedRow.Cells(2).Text
            txtMsgErrorCas.Text = GDTABLA.SelectedRow.Cells(3).Text
                End Sub

    miércoles, 19 de septiembre de 2018 10:54

Respuestas

  • ya lo he solucionado, el problema era que entraba dos veces en el RowDeleting, porque dentro de esta actualizaba el grid y por ello lo volvia a llamar. He puesto una variable global que controle cuando entra la primera vez y asi ya no vuelve ha hacer de nuevo.
    • Marcado como respuesta nere_neria jueves, 20 de septiembre de 2018 12:18
    jueves, 20 de septiembre de 2018 12:18

Todas las respuestas

  • hola

    lo primero que voy a recomendar es que quites esto

    Catch ex As Exception

    End Try

    NUNCA definas un try..catch vacio, es una pesima idea, si hay un problema nunca te enteras

    Lo que no veo correcto es qe tengras que reconstruir los datos del datatable desde el gridview, eso esta mal

    se supone que debes mantener los datos del datatable en Session, entonces agregas o remueves del alli, uar esto

    For i As Integer = 0 To GDTABLA.Rows.Count - 1

    cada vez que quieres realizar una operacion es una pesima idea

    Manten el datatable en Session(key)

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    miércoles, 19 de septiembre de 2018 15:35
  • Buenas,

    Ya sé que el try catch no se pone de ese modo, lo que pasa que no lo había terminado, pero gracias por el apunte.

    Y el tema de reconstruir el datatable, y no mantener en sesión, es porque puede haber bastantes iteraciones al mismo tiempo del programa y no creo que sea muy viable. Pero si me equivoco, me gustaría que me pudieras aclarar las razones.

    A la espera de tu respuesta,

    Un saludo.

    jueves, 20 de septiembre de 2018 7:22
  • ya lo he solucionado, el problema era que entraba dos veces en el RowDeleting, porque dentro de esta actualizaba el grid y por ello lo volvia a llamar. He puesto una variable global que controle cuando entra la primera vez y asi ya no vuelve ha hacer de nuevo.
    • Marcado como respuesta nere_neria jueves, 20 de septiembre de 2018 12:18
    jueves, 20 de septiembre de 2018 12:18