none
datagridview lento con imagenes RRS feed

  • Pregunta

  • He puesto una columna con imagenes en un datagridview y desde que la he puesto va lento.
    Tengo una columna con la ruta donde estan las imagenes y las muestro con el siguiente codigo

     Dim I As Integer
            Dim F As Integer = MiDatatable1.Rows.Count - 1
    
            For I = 0 To F
                TextBox2.Text = Me.DataGridView1.Rows(I).Cells("ruta_Foto").Value 
                Me.DataGridView1.Rows(I).Cells("Imagen").Value = New System.Drawing.Bitmap(TextBox2.Text) 
            Next
    


    ¿Alguna idea para poner las imagenes y no tarde tanto al refrescar el datagrid?

    Otro problema que tengo es que necesito poner primero la ruta a la imagen en un texbox y buscarla ahí porque si no me da error ya que la tuta tiene espacios
    • Cambiado Enrique M. Montejo sábado, 30 de julio de 2011 10:57 Controles de Windows Forms (De:Lenguaje VB.NET)
    viernes, 15 de mayo de 2009 19:04

Todas las respuestas

  • hola,

    recuerda que tambien puedes hacer algo como:

            For Each row As DataGridViewRow In dataGridView.Rows
       
                  row.Cells("Imagen").Value = New System.Drawing.Bitmap(TextBox2.Text)
             
            Next


    Digo por ahi ese for es mas performante que el acceso por indice, pero no creo, es ams que nada para que el codigo este mas prolijo.

    Con respecto a el path con espaciones, no llegue a entender el problema.
    Ademas porque es que haces uso de un TextBox para ello, puede de ultima utilizar una variable:

            For Each row As DataGridViewRow In dataGridView.Rows
                 
                  Dim pathImage As String = row.Cells("ruta_Foto").Value
                  row.Cells("Imagen").Value = New System.Drawing.Bitmap(TextBox2.Text)
             
            Next


    igual es muy raro deberia poder hacer esto sin problemas:

            For Each row As DataGridViewRow In dataGridView.Rows
          
                  row.Cells("Imagen").Value = New System.Drawing.Bitmap(
    row.Cells("ruta_Foto").Value )
             
            Next



    saludos

    Leandro Tuttini
    sábado, 16 de mayo de 2009 15:19
  • Gracias Leandro pero sigue igual de lento.
    Estoy probando solo con 10 registros y tarda algo mas de 1 segundo en refrescar los datos.
    Tengo que decir por si no se entendio que cada fila tiene una imagen distinta no la misma para todas las filas. Son jpg. Al principio creia que podia ser por el tamaño de las imagenes pero las he hecho de pocos kb y tarda lo mismo

    Con
    For Each row As DataGridViewRow In dataGridView.Rows
       
                  row.Cells("Imagen").Value = New System.Drawing.Bitmap(TextBox2.Text)
             
            Next

    tarda lo mismo

    Las otras 2 opciones que me das para quitar el textbox no me sirven y ya habia probado cosas parecidas.
    En la primera la de hacer una variable pathImage me da el error de "Caracteres no válidos en la ruta de acceso"

    En la ultima opción me da error en toda esta parte
    New System.Drawing.Bitmap( row.Cells("ruta_Foto").Value )

    El error es
    Error 1 Error de resolución de sobrecarga porque ninguna de las funciones 'New' a las que se tiene acceso se puede llamar sin una conversión de restricción:
        'Public Sub New(original As System.Drawing.Image)': El parámetro 'original' correspondiente al argumento se reduce de 'Object' a 'System.Drawing.Image'.
        'Public Sub New(stream As System.IO.Stream)': El parámetro 'stream' correspondiente al argumento se reduce de 'Object' a 'System.IO.Stream'.
        'Public Sub New(filename As String)': El parámetro 'filename' correspondiente al argumento se reduce de 'Object' a 'String'. 
    sábado, 16 de mayo de 2009 19:33
  • hola,

    se me ocurren varias cocsas que se pueden probar a ver si se puede mejorar la performance en la carga de las imagenes.

    How to add Image in the DataGridView or ListView Column, VB.NET

    como veras en el link hay varias cosas que se puede hacer.

    - no se si estas utilizando un DataGridViewImageColumn

    - utiliza el Bitmap.FromFile(), para cargar la imagen

    - podras como hace en el ejemplo uso de control
    ImageList, cargar primero alli las imagenes y luego asignarlas al datagrid.

    - tambien en lugar de cargar las imagenes en el loop podrias hacer uso del evento:
    DataGridView. CellFormatting Event
    este se dispara una vez por cada fila que se bindea, por ahi alli podrias tomar la celda y cargarle la imagen.

    saludos

    Leandro Tuttini
    sábado, 16 de mayo de 2009 20:34
  • Las imágenes bajan mucho el rendimiento de las aplicaciones en Visual Basic.

    Yo lo que hago en Tener el DataGridView solo con texto, pero cuando selecciono una fila, tengo una columna que sirve de ruta, para mostrar en un picturebox la imagen asociada a la fila seleccionada.

    Con esto me evito el proceso de carga de todas las imágenes por fila en el datagrid...

    Antes también tenía incluidas las imágenes en la misma base de datos, pero es algo que no aconsejo si se desea velocidad de proceso.

    sábado, 10 de octubre de 2009 15:13
  • Una solucion importante a tener en cuenta es utilizar enterprise library 5. Se utiliza Caching block que permite cargar en dataset en memoria y de esta manera demora solo la primera vez y una ver cargado funciona rápidamente. Fue mi solucion.

    http://www.codersource.net/asp-net/application-blocks/enterprise-library-caching-block.aspx

    http://www.codeproject.com/KB/web-cache/CachingApplicationBlock.aspx

     

    saludos.

    miércoles, 16 de junio de 2010 6:50
  • hola

     

    todavia persiste  tu problema  ,, no te ha ayudado la informacion que te facilitaron ?

     

    enmanuel grullard

    republica dominicana

     

     

    miércoles, 16 de junio de 2010 13:24
  • Para evitar este problema lo mejor que puedes hacer es usar un Imagelist con las propiedades de tamaño adecuadas para la celda en donde piensas mostrar la imagen , antes de ligar la imagen a al celda almacena la imagen en la image list este se encargara de redimencionar y ajustar la calidad de la imagen a una menor y mas optima para el DataGrid View , a si mismo al mantener las imagenes ya cargadas en el Imagelist se mantiene un tiempo de respuesta mas alto al tenerlos en memoria y no en disco duro para cargarse cada ves qeu se redibuje la imagen....

    A también no olvides establecer la propiedad doublebufered  del form eso tambien te ayudara a mejorar el desempeño.

    SAludos.

    martes, 19 de julio de 2011 17:46