Geeks•ms
Todo lo que los geeks de Windows y .Net tienen que contar
Juega a la Cura, código de registro: laresistencia

sobre progressbar, listview y sql

valorado por 0 usuarios
Este artículo tiene 2 Respuestas | 2 Seguidores

Sin rango
Envíos: 1
Puntos: 35

 

hola a todos, estoy haciendo un aplicacion en vb 2005 y trabajo con sql server 2005, estoy haciendo un procedimiento para llenar mi listview con los datos de mi tabla, pero mi tabla tiene como 2000 registros entonces demora al hacer dicho procedimiento, entonces pense en poner un progressbar para mostrar el avance de mi procedimiento o simularlo, quisiera saber como puedo hacer esto. me dijeron por ahi con hilos pero no se mucho de eso, a ver si me pueden dar un ejemplo de eso. gracias de antemano bye
Contribuyente Top 500
Hombre
Envíos: 5
Puntos: 165

 Dado el número de elementos para el listview, no te sería más útil el datagridview?

  • | Puntos de post: 5
Contribuyente Top 50
Hombre
Envíos: 233
Puntos: 5,105

Hola,

Tienes que usar una combinación de técnicas para obtener una rapidez de carga óptima. La primera es utilizar el par de métodos BeginUpdate() y EndUpdate(). Cuando llamas a BeginUpdate, deshabilitas la actualización del ListView, de manera que añadir nuevos ListViewItem no fuerza el redibujado del grid. Esto sólo ya hace que la carga sea mucho más rápida.

Sin embargo, si quieres mostrar una barra de progreso, tendrás que utilizar un hilo ejecutándose en segundo plano. Pero teniendo en cuenta que ese hilo no podrá modificar la interfaz de usuario, tendrás que hacer llamadas entre hilos. Para ello, tienes que utilizar el método Invoke del ListView, que hará que se ejecute un método en el hilo de la interfaz de usuario.

Los pasos a realizar son los siguientes:

  • Crear una clase que tenga como propiedades los datos necesarios para rellenar el listview
  • Crear un método público en esta clase que tomando los datos de las propiedades del objeto anterior vaya rellenando el listview. Para poder hacer esto, una de las propiedades de esta clase debería ser el listview sobre el que trabajar, y otra propiedad una referencia al progressbar que quieres actualizar.
  • Crear un método que te permita añadir un nuevo elemento en el listview pasándole por parámetro los datos del nuevo elemento.
  • Crear un delegado con la misma "firma" del método que has creado en el paso anterior.
  • En el método público llamar al método que se encarga de rellenar el listview, llamas al método creado en el paso 3 de manera normal.
  • Probar la clase. Una vez que funcione correctamente, pasamos al siguiente paso.
  • Realizar la llamada al método de la clase utilizando un Thread. Para ello, lo primero es inicializar la instancia de la clase (que ya lo habrás hecho para probar la clase), y luego llamar al método. Reemplaza el código de llamada al método por lo siguiente:

Thread hiloDeCarga = new Thread(new ThreadStart(miObjetoDeCarga.MetodoPublicoDeCarga));
hiloDeCarga.Start();

  • Con esto, ya tienes el código ejectuándose en otro hilo, pero no te funcionará. Dará una excepción de acceso no autorizado, porque no puedes modificar controles de la interfaz de usuario desde otro hilo. Hay que modificar la clase de carga para que cuando se van a modificar controles, en vez de hacerlo directamente, se realice a través de un Invoke, utilizando la referencia que tienes al control que quieres modificar.

Espero que esto te oriente y puedas resolver la situación. Un saludo,

 

Augusto.

  • | Puntos de post: 5
Página 1 de 1 (3 elementos) | RSS
Juega a la Cura, código de registro: laresistencia