Listview: Item siempre visible

Siempre que se agregan nuevos elementos ListviewItems a un control listview, y estos son tantos que el control no tiene espacio suficiente para mostrarlos en pantalla, se agrega una barra de desplazamiento vertical. Esto está perfecto, solo que por default no se ven los nuevos items que se van agregando.

Hoy quiero mostrarles como solucionar este pequeño inconveniente.

Los controles de visual basic .net cono el listview nos brindan una cantidad impresionante de propiedades para su configuración, tantas que muchas veces se desconocen.

Quiero mostrarlo con un ejemplo muy sencillo. Para ello necesitaremos un formulario, un control listview y un botón.

listviewItemSiempreVisible001

Las propiedades que mas nos interesan son las siguientes:

  • HideSelection: la establecemos en false para que aunque el control listview no tenga el foco, sigamos viendo cual es el item seleccionado.
  • ListView1.FocusedItem.EnsureVisible() para forzar al item seleccionado a estar siempre visible.

Bueno, ahora si el código:

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ListView1.HideSelection = False
        ListView1.FullRowSelect = True
        ListView1.MultiSelect = False
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Static i As Integer = 0
        i += 1
        ListView1.Items.Add(New ListViewItem("Item número " & i))
        ListView1.Items(ListView1.Items.Count - 1).Selected = True
        ListView1.Items(ListView1.Items.Count - 1).Focused = True

        ListView1.FocusedItem.EnsureVisible()
    End Sub

Al ejecutarlo debería verse muy parecido a lo que se muestra en esta imagen:

listviewItemSiempreVisible002

Eso es todo, si te sirvió esta información, por favor, deja un comentario.



11 Responses to “Listview: Item siempre visible”

  1. Información Bitacoras.com…

    Valora en Bitacoras.com: Siempre que se agregan nuevos elementos ListviewItems a un control listview, y estos son tantos que el control no tiene espacio suficiente para mostrarlos en pantalla, se agrega una barra de desplazamiento vertical. Esto está…..

  2. MISTICO dice:

    Bueno todos sabemos q se muestren los datos pero a mi me interesaria q si pueden explicar como se guarden en un modulo aunq se sierre el programa

  3. RCHARD dice:

    UNA PREGUNTA ESE MISMO EJEMPLO QUIERO PERO PARA UN DATAGRIDVIEW NO SE SI SE PODRIAS AYUDARME EN ESE PROBLEMA

    MI CORREO:
    richardramos789@hotmail.com
    TE ESTARIA AGRADECIDO SI ME AYUDARAS

  4. Jorge dice:

    Hola que tal,

    Mira yo tengo una duda con un listview que implemento en mi sistema, estoy armando un sistema punto de venta y al introducir un codigo en mi txtbox logro imprimirlo en mi listview correctamente, mi duda es que quiero que al momento de registrar el mismo producto, en lugar que se añade una nueva fila se añada a la misma y en la columna Cantidad vaya aumentando el numero.

    Por ejemplo si añado 12345, queda impreso en mi listview, pero si vuelvo añadir 12345 en lugar que se imprima en una nueva fila, se imprima en la 1 fila pero que en la columna aumenta a cantidad 2, no se si me explique o si me pudiera guiar en esta duda que tengo se lo agradeceria mucho.

    • Eliseo dice:

      no me queda muy claro que es lo que quieres hacer, pero te sugiero que mires este ejemplo que te puede ser de utilidad: http://www.solovb.net/index.php/2009/02/19/modificar-datos-de-un-listview/
      Cualquier otra duda no dejes de consultarme.

      Saludos

    • Oscar dice:

      Hola Jorge, lo que pides involucra persistencia de datos y que se actualice una columna perteneciente a la fila de una llave específica en una tabla; para ello puedes optar por 2 soluciones: la primera que crees una BD con los campos que necesitas y utilices una conexión ya sea con MySQL usando el adaptador para ello o el SQL Server incluido en Visual Studio, la otra forma es por medio de archivos planos que guarden los datos correspondientes en un fichero .txt y luego se proceda a la lectura y reescritura de algunos datos; para ambas opciones como necesitas incrementar el valor para una columna rewquerida, debes también aplicar una función que incremente este valor basado en la condición que requieres. :)

  5. Jorge dice:

    Muchas gracias Eliseo por tu pronta respuesta.

    Ok mira te explico. Tengo un TextBox en el cual añado los productos que tengo en mi DB, ok por ejemplo, Coca-cola, introduzco el codigo de barras en mi TextBox en este caso seria 12345678, bueno se muestra en mi listview el producto con su descripcion mis columnas del listview son:

    Codigo Producto, Descripcion, Cantidad, Precio Venta, Existencia.

    Entonces al añadirse el producto queda mi fila llena de esos datos en mi listview, pero si yo vuelvo a insertar el codigo de la coca-cola, se muestra en una siguiente fila, lo que me gustaria hacer, es que al momento de insertar otra vez el mismo producto en lugar de mostrarse en una nueva fila, solo cambie el numero de mi columna Cantidad, en este caso cambiaria a 2.

    Eso es mas que nda lo que quiero hacer, si me pudieras decir mas o menos como resolver esta duda te lo agradeceria.

    Gracias

    • Eliseo dice:

      Bueno, ahora esta un poco mas claro.

      Lo primero que tienes que hacer antes de insertar una nueva linea es recorrer el listview para verificar si ya se ha ingresado el código que estas intentando insertar.
      Eso lo haces con un For Each, por ejemplo

      ‘Creo una variable para que me indique si encontro que el código ya existia
      Dim existe as boolean = False
      For each item as ListViewItem in listviewProductos.items
      if item.text = txtCodigo.text Then
      ‘Si entra acá es porque ya estaba cargado
      dim cantidadAnterior as Integer = CType(item.subitm(2).text, Integer)
      item.subitem(2).text = cantidadAnterior + CType(txtCantidad.text, Integer)
      ‘Si lo encontró le aviso que ya existia
      existe = True
      end if
      Next

      If Not existe Then
      ‘Aca lo inserto pues no lo encontró
      End if

      Bueno, espro que te sirva… no descarto que pueda terner algún error de tipeo dado que lo escribí directamente acá

      Pero seguro que te va a servir

  6. Jorge dice:

    Gracias nuevamente,

    Mira te comento que si me ha dado resultado en cuestión a que si cambia el valor de la columna Cantidad, lo que pasa es que estoy extrayendo los valores de una base de datos de MySQL mira te muestro el codigo de como imprimo mi listview

    Private Sub listview()
    Dim i As Integer
    Dim s As Integer
    Dim contador As Integer
    Dim Subtotal As Double
    Dim listar As New ListViewItem

    Dim cadena As New MySqlCommand(“SELECT * FROM productos WHERE CodigoProducto =’” & txtCodigoBarras.Text & “‘”, con)

    mysqldr = cadena.ExecuteReader()

    While mysqldr.Read()
    listar = ListView1.Items.Add(txtCodigoBarras.Text.Trim)
    listar.SubItems.Add(CStr(mysqldr(“Descripcion”)))
    listar.SubItems.Add(CStr(mysqldr(“Cantidad”)))
    listar.SubItems.Add(CStr(mysqldr(“PrecioVenta”)))
    listar.SubItems.Add(CStr(mysqldr(“Stock”)))
    End While

    Dim existe As Boolean = False

    For Each item As ListViewItem In ListView1.Items
    If item.Text = txtCodigoBarras.Text Then
    Dim cantidadAnterior As Integer = CType(listar.SubItems(2).Text, Integer)
    listar.SubItems(2).Text = cantidadAnterior + CType(mysqldr(“Cantidad”), Integer)
    existe = True
    End If
    Next
    If Not existe Then
    End If

    lblCantidadProd.Text = mysqldr.Item(3)
    lblPrecioUnidad.Text = mysqldr.Item(5)

    For s = 0.0 To ListView1.Items.Count – 1
    Subtotal = Subtotal + ListView1.Items(s).SubItems(3).Text
    Next
    lbLSubTotal.Text = “$” & Format(Subtotal, “0.00″)

    For i = 0 To ListView1.Items.Count – 1
    contador = contador + ListView1.Items(i).SubItems(2).Text
    Next
    Me.lblContador.Text = contador

    mysqldr.Close()
    End Sub

    El codigo que me pasaste asi lo implemente y mira los resultados en la foto siguiente:

    http://img193.imageshack.us/img193/4421/productosv.jpg

  7. Jorge dice:

    Amigo disculpa si te molesto haha con tanta pregunta, pero ya mas o menos estoy encontrando el problema, por ejemplo introduzco el producto

    DORITOSNAC

    Se introduce en la primera fila y cuando vuelvo a poner DORITOSNAC se imprime en la segunda fila pero el que ya habia introducido primero cambia su valor de cantidad a 2 y lo vuelvo a introducir se imprime otra vez en una 3 fila pero de igual manera el de la 1 fila cambia su valor a 3

    If txtCodigoBarras.Text = txtCodigoBarras.Text Then
    Dim existe As Boolean = False
    For Each item As ListViewItem In ListView1.Items
    If item.Text = txtCodigoBarras.Text Then
    Dim cantidadAnterior As Integer = CType(item.SubItems(2).Text, Integer)
    item.SubItems(2).Text = cantidadAnterior + CType(lblCantidadProd.Text, Integer)
    existe = True
    End If
    Next
    If Not existe Then
    End If

    A ver si lo consigo ahorita si no cualquier explicacion de tu parte te la agradeceria.

  8. Jorge dice:

    ya lo logre solucionar muchisimas gracias por tu apoyo pongo la solucion:

    Dim conteo As Integer
    For j As Integer = 0 To Me.ListView1.Items.Count – 1
    If Me.ListView1.Items(j).SubItems(0).Text = txtCodigoBarras.Text Then
    conteo = CInt(Me.ListView1.Items(j).SubItems(2).Text) + 1
    Me.ListView1.Items(j).SubItems(2).Text = conteo
    Exit Sub

Comentar