none
Problema con una instancia FOR asp.net - vb.net RRS feed

  • Pregunta

  • Hola a todos! es mi primer post, lamento que sea por una pregunta y no para una ayuda de mi parte!... les paso a comentar mi problema, intentar explicarlo de la mejor manera ya que no me deja subir imagenes el foro...

    Estoy realizando un programa en asp.net, es para una despensa y trabaja con un lector de codigos de barra... el mismo va cargando en un gridview los productos que van escaneando ( el gridview tiene 4 columnas... item, codigo, descripcion, precio)

    mi problema surge en el momento en el que quiero borrar un item de ese gridview (para hacerlo selecciono la fila y luego pulso el boton borrar el cual desencadena el evento eliminarfila)...

        Sub eliminarfila()
            Dim tempDetalle As DataTable
            tempDetalle = ViewState("detalle")
            Dim nRec As DataRow
            nRec = tempDetalle.Rows(gvDetallePedido.SelectedValue() - 1)
            Dim ubicacion As Integer
            ubicacion1 = Convert.ToInt32(gvDetallePedido.SelectedValue().ToString)

            ubicacion = gvDetallePedido.Rows.Count - (gvDetallePedido.SelectedValue() - 1)


            tempDetalle.Rows.Remove(nRec)
            gvDetallePedido.DataSource = tempDetalle
            gvDetallePedido.DataBind()
            If gvDetallePedido.Rows.Count > 0 Then


                gvDetallePedido.Visible = True
                Me.Panel2.Visible = False
                Me.btnConfirmar.Visible = False
                Me.btnCancelar.Visible = False
                Me.txtItem.Text = "1"
                Me.lblItem.Text = gvDetallePedido.Rows.Count.ToString()
                gvDetallePedido.DataBind()



            Else
                gvDetallePedido.Visible = False
            End If

        End Sub


    el programa borra correctamente la fila, pero a la hora de acomodar el contador en la columna "ITEM" en la cual utilizo una clausula "FOR" no las acomoda correctamente

      el for repite el bucle una vez mas de la que necesito y vuelve a bajar 1 valor al ultimo "ITEM" del grid view ( por ejemplo si el gridview tiene 6 filas y borro una en vez de quedar en 5, baja a 4 el ultimo valor al igual que el ITEM anterior)... este es el codigo donde se ejecuta la instancia FOR...

       Protected Sub gvDetallePedido_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvDetallePedido.RowDataBound
            If Me.txtItem.Text = "1" Then



                If (e.Row.RowType = DataControlRowType.DataRow) Then
                    Dim primero As Integer = ubicacion1
                    Dim ultimox As Integer = Convert.ToInt32(Me.lblItem.Text) - 1
                    Dim ultimo As Integer = ultimox

                    For Counter = 1 To ultimo - 1 Step +1

                        Dim x As Integer = Convert.ToInt32((e.Row.Cells(1).Text).ToString)

                        If x = primero Then

                        Else
                            If x > primero Then
                                Dim itemX As Integer = Convert.ToInt32((e.Row.Cells(1).Text).ToString)
                                Dim X2 As Integer = itemX - 1
                                e.Row.Cells(1).Text = X2
                            End If

                        End If
                        primero = primero + 1
                    Next Counter
                End If

    ----------------------------------------------------------------------------------------------------------------

    este sector cumple otra función ajena a mi problema

    ----------------------------------------------------------------------------------------------------------------

    Else

                If e.Row.RowType = DataControlRowType.DataRow Then
                    dTotal += Convert.ToDecimal(DataBinder.Eval(e.Row.DataItem, "precio"))
                End If
                If e.Row.RowType = DataControlRowType.Footer Then
                    e.Row.Cells(2).Text = "Total:"
                    e.Row.Cells(3).Text = dTotal.ToString("c")
                    e.Row.Cells(3).HorizontalAlign = HorizontalAlign.Right
                    e.Row.Font.Bold = True
                End If
    ----------------------------------------------------------------------------------------------------------------
            End If
        End Sub

    tengan en cuenta que les mando el codigo despues de haber probado un monton de formas distintas de ejecutarlo, por eso se ve desordenado y mal trabajado...

    Desde ya muchisimas gracias por su atencion y cualquier cosa que no entiendan de lo que intente explicar recien me preguntan!, saludos!

                                      Andrés

    viernes, 18 de mayo de 2018 3:12

Respuestas

  • solucione el problema, aparentemente la clausula FOR estaba condicionada por la variable counter e ingresaba a recorrer "TODAS" las filas del gridview (mayores a la que eliminaba) tantas veces como esa variable lo indicaba, por ende si la variable counter iba de 1 a 3, entraba dos veces, una primera por todas las filas y la segunda por la ultima fila, lo solucione dejando el FOR asi:

    " For Counter As Integer = 1 To 1"

    de esta forma el bucle for ejecuta una vuelta unica por cada fila del gridview mayores a la fila borrada y modifica correctamente cada item.... gracias enrique por tu guia y ayuda! me dio la pauta para encontrar el error!, saludos!

    sábado, 19 de mayo de 2018 14:20

Todas las respuestas

  • "Rover Infrmática" escribió:

    > ... el for repite el bucle una vez mas de la que necesito y vuelve a bajar 1 valor al
    > ultimo "ITEM" del grid view ( por ejemplo si el gridview tiene 6 filas y borro una en
    > vez de quedar en 5, baja a 4 el ultimo valor al igual que el ITEM anterior)... este
    > es el codigo donde se ejecuta la instancia FOR...
    >
    >  Protected Sub gvDetallePedido_RowDataBound( ... ) Handles gvDetallePedido.RowDataBound
    >
    >   ...
    >   ...
    >
    >   Dim ultimox As Integer = Convert.ToInt32(Me.lblItem.Text) - 1
    >   Dim ultimo As Integer = ultimox
    >
    >   For Counter = 1 To ultimo - 1 Step +1

    Hola, Andrés:

    Si tu intención es recorrer el bucle For ... Next hasta el valor que tenga la variable llamada "ultimo", si te fijas bien, le estás quitando dos unidades al valor existente en el control llamado "lblItem":

        - Una cuando declaras la variable "ultimox":

          Dim ultimox As Integer = Convert.ToInt32(Me.lblItem.Text) - 1

        - Y otra, al recorrer el propio bucle For ... Next:

          For Counter = 1 To ultimo - 1 Step +1

    Por tanto, si el valor del control "lblItem" es "5", el bucle For ... Next se ejecutará desde 1 a 3, no de 1 a 4, que me imagino será como deseas que se ejecute.

    Por cierto, si el valor del iterador del bucle (Counter) es positivo, no es necesario que especifiques la cláusula Step.

    Verifica si con la siguiente modificación se resuelve el problema planteado:

        If (e.Row.RowType = DataControlRowType.DataRow) Then
        
            Dim primero As Integer = ubicacion1
            Dim ultimo As Integer = Convert.ToInt32(Me.lblItem.Text) - 1
    
            For Counter As Integer = 1 To ultimo
    
                Dim x As Integer = Convert.ToInt32(e.Row.Cells(1).Text)
    
                If (x > primero) Then
                    e.Row.Cells(1).Text = (x - 1).ToString()
                End If
    
                primero = primero + 1
     
            Next Counter
    
        ...
    
        ...
    
        End If
    

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    viernes, 18 de mayo de 2018 9:26
    Moderador
  • "Rover Infrmática" escribió:

    > ... el for repite el bucle una vez mas de la que necesito y vuelve a bajar 1 valor al
    > ultimo "ITEM" del grid view ( por ejemplo si el gridview tiene 6 filas y borro una en
    > vez de quedar en 5, baja a 4 el ultimo valor al igual que el ITEM anterior)... este
    > es el codigo donde se ejecuta la instancia FOR...
    >
    >  Protected Sub gvDetallePedido_RowDataBound( ... ) Handles gvDetallePedido.RowDataBound
    >
    >   ...
    >   ...
    >
    >   Dim ultimox As Integer = Convert.ToInt32(Me.lblItem.Text) - 1
    >   Dim ultimo As Integer = ultimox
    >
    >   For Counter = 1 To ultimo - 1 Step +1

    Hola, Andrés:

    Si tu intención es recorrer el bucle For ... Next hasta el valor que tenga la variable llamada "ultimo", si te fijas bien, le estás quitando dos unidades al valor existente en el control llamado "lblItem":

        - Una cuando declaras la variable "ultimox":

          Dim ultimox As Integer = Convert.ToInt32(Me.lblItem.Text) - 1

        - Y otra, al recorrer el propio bucle For ... Next:

          For Counter = 1 To ultimo - 1 Step +1

    Por tanto, si el valor del control "lblItem" es "5", el bucle For ... Next se ejecutará desde 1 a 3, no de 1 a 4, que me imagino será como deseas que se ejecute.

    Por cierto, si el valor del iterador del bucle (Counter) es positivo, no es necesario que especifiques la cláusula Step.

    Verifica si con la siguiente modificación se resuelve el problema planteado:

        If (e.Row.RowType = DataControlRowType.DataRow) Then
        
            Dim primero As Integer = ubicacion1
            Dim ultimo As Integer = Convert.ToInt32(Me.lblItem.Text) - 1
    
            For Counter As Integer = 1 To ultimo
    
                Dim x As Integer = Convert.ToInt32(e.Row.Cells(1).Text)
    
                If (x > primero) Then
                    e.Row.Cells(1).Text = (x - 1).ToString()
                End If
    
                primero = primero + 1
     
            Next Counter
    
        ...
    
        ...
    
        End If

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción 

    muchas gracias por contestar enrique, lamentablemente no, sigue ejecutandose de la misma manera, la clausula for realiza una pasada extra y vuelve a descontar 1 en el ultimo item :/

    sábado, 19 de mayo de 2018 14:05
  • solucione el problema, aparentemente la clausula FOR estaba condicionada por la variable counter e ingresaba a recorrer "TODAS" las filas del gridview (mayores a la que eliminaba) tantas veces como esa variable lo indicaba, por ende si la variable counter iba de 1 a 3, entraba dos veces, una primera por todas las filas y la segunda por la ultima fila, lo solucione dejando el FOR asi:

    " For Counter As Integer = 1 To 1"

    de esta forma el bucle for ejecuta una vuelta unica por cada fila del gridview mayores a la fila borrada y modifica correctamente cada item.... gracias enrique por tu guia y ayuda! me dio la pauta para encontrar el error!, saludos!

    sábado, 19 de mayo de 2018 14:20