none
Problema con Listview y Textbox RRS feed

  • Pregunta

  • Estoy haciendo un programa donde tengo un listview llamado list_PRODUCTOS con 2 columnas. En el se cargan el nombre del producto en la columna NOMBRE y su valor en la columna VALOR. A la vez, tengo un textbox llamado txtVALOR_TOTAL el cual va sumando automaticamente el valor de los productos que se van añadiendo. Todo va perfecto. El problema esta en que tengo un boton que elimina los productos seleccionados en el listview, pero no realiza correctamente la resta. Por logica, el total seria el valor del (textbox txt_VALOR_TOTAL - el valor del item seleccionado), pero no encuentro el codigo para tomar dicho valor y restarlo al total.
    El codigo que uso solo para eliminar los elementos en el boton eliminar es el siguiente.

    Dim lista As ListViewItem = New ListViewItem()

    For Each lista In list_PRODUCTOS.SelectedItems
       lista.Remove()
    Next

    Ayudenme por favor.

    lunes, 15 de agosto de 2016 19:57

Respuestas

  • Hola Erick Q,

    Te recomendaría que crees un método para calcular el valor, así podrás reutilizarlo cuando agregues y/o elimines elementos en el ListView.

    Algo así :

    Private Sub calcularValor()
     txtVALOR_TOTAL.Text = list_PRODUCTOS.Items.Cast(Of ListViewItem).Sum(Function(x) x.SubItems(1).Text)
    End Sub

    Y cuando elimines los registros :

      Private Sub btnRemover_Click(sender As Object, e As EventArgs) Handles Button1.Click
            For Each lista As ListViewItem In list_PRODUCTOS.SelectedItems
                lista.Remove()
            Next
            calcularValor()
      End Sub

    Teniendo como resultado :

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    lunes, 15 de agosto de 2016 20:40

Todas las respuestas

  • Hola Erick Q,

    Te recomendaría que crees un método para calcular el valor, así podrás reutilizarlo cuando agregues y/o elimines elementos en el ListView.

    Algo así :

    Private Sub calcularValor()
     txtVALOR_TOTAL.Text = list_PRODUCTOS.Items.Cast(Of ListViewItem).Sum(Function(x) x.SubItems(1).Text)
    End Sub

    Y cuando elimines los registros :

      Private Sub btnRemover_Click(sender As Object, e As EventArgs) Handles Button1.Click
            For Each lista As ListViewItem In list_PRODUCTOS.SelectedItems
                lista.Remove()
            Next
            calcularValor()
      End Sub

    Teniendo como resultado :

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    lunes, 15 de agosto de 2016 20:40
  • Erick Q,

    Reforzando la propuesta ofrecida: encapsular funcionalidad para reutilizarla es una buena practica, sin embargo hay principios que se deben tomar en cuenta y una de ellas -que también aplica al diseño modular- es perseguir el bajo acoplamiento, nota que el procedimiento ofrecido 'calcularValor() ' acopla funcionalidad con una instancia de la clase TextBox y la clase ListView, lo que conceptualmente no es correcto. Sugiero que el procedimiento desarrollado sea uno de tipo Function con un grado menos de acoplamiento:

    Private Function SumarValores(Data As ListView, Indice As Integer)
    
            Return Data.Items.Cast(Of ListViewItem).Sum(Function(x) x.SubItems(Indice).Text)
    End Function

    txtVALOR_TOTAL.Text = SumarValores(list_Productos, 1)

    Incluso el nivel de abstracción podría ser mayor si en vez de un tipo ListView -como parámetro- se define una colección genérica bajo cualquier de sus formas.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    lunes, 15 de agosto de 2016 21:18