Test Foro de elhacker.net SMF 2.1

Programación => Programación General => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Eleкtro en 31 Diciembre 2012, 12:45 PM

Título: [SOLUCIONADO] ¿Como evitar el efecto Flashing de un listview?
Publicado por: Eleкtro en 31 Diciembre 2012, 12:45 PM
Cuando añado un item al listrview, hace un flash, un efecto muy desagradable.

Lo he intentado TODO, AddRange, Suspendlayout, Me.Doublebuffered, y por último BeginUpdate... Nada lo ha resuelto.

Código (vbnet) [Seleccionar]

for each file....

               Problems += 1
               str(0) = Problems
               str(1) = str(1).Substring(2)
               str(2) = File.FullName
               itm = New ListViewItem(str)
               InvokeControl(ListView, Sub(x) x.BeginUpdate())
               InvokeControl(ListView, Sub(x) x.Items.Add(itm))
               InvokeControl(ListView, Sub(x) x.EnsureVisible(ListView.Items.Count - 1))
               InvokeControl(ListView, Sub(x) x.EndUpdate())
end for...


Esto es otra variante del código, aquí noto cierta mejora (Flashes más cortos):
Código (vbnet) [Seleccionar]

  Private Sub AddItemToListView()
       str(0) = Problems
       str(1) = str(1).Substring(2)
       str(2) = File.FullName
       itm = New ListViewItem(str)
       ListView.SuspendLayout()
       InvokeControl(ListView, Sub(x) x.BeginUpdate())
       InvokeControl(ListView, Sub(x) x.Items.Add(itm))
       InvokeControl(ListView, Sub(x) x.EnsureVisible(ListView.Items.Count - 1))
       InvokeControl(ListView, Sub(x) x.EndUpdate())
       ListView.ResumeLayout()
       If NumberIsOdd(Problems) Then
           itm.BackColor = Color.FromArgb(15, 15, 15)
       Else
           itm.BackColor = Color.FromArgb(30, 30, 30)
       End If
   End Sub




Sé que el AddRange y BeginUpdate están pensados para añadir varios items, pero como podeis comprobar en el ejemplo es que yo necesito añadirlos uno por uno.

¿Que puedo hacer?
Título: Re: ¿Como evitar el efecto Flashing de un listview?
Publicado por: seba123neo en 31 Diciembre 2012, 12:55 PM
se llama flickering, y lo evitas creando una clase que herede del listview comun, y asi le podes asignar la variable DoubleBuffered.

Código (vbnet) [Seleccionar]
    Public Class ListviewEx
        Inherits ListView

        Public Sub New()
            MyBase.New()
            Me.DoubleBuffered = True
        End Sub
    End Class


eso te aparece como un control mas en la barra de herramientas y lo usas como un listview comun, si lo necesitas usar desde codigo tenes que declarlo de la siguiente forma:

Código (vbnet) [Seleccionar]
Private WithEvents lvPedidos As ListviewEx
Título: Re: ¿Como evitar el efecto Flashing de un listview?
Publicado por: Eleкtro en 31 Diciembre 2012, 13:35 PM
OMG !

Seba, eso es la diferencia entre un verdadero experto, y todas las demás supuestas soluciones que salen en Google.

Mil gracias. ;D

Ya me has demostrado varias veces que se puede salir de apuros parecidos heredando controles, la próxima vez intentaré eso antes de preguntar,
Lo que no llego a comprender es porque el control original no tiene el DoubleBuffered ON, maldito Microsoft, en fin!!.

Un saludo.
Título: Re: ¿Como evitar el efecto Flashing de un listview?
Publicado por: spiritdead en 1 Enero 2013, 00:23 AM
Cita de: EleKtro H@cker en 31 Diciembre 2012, 13:35 PM
OMG !

Seba, eso es la diferencia entre un verdadero experto, y todas las demás supuestas soluciones que salen en Google.

Mil gracias. ;D

Ya me has demostrado varias veces que se puede salir de apuros parecidos heredando controles, la próxima vez intentaré eso antes de preguntar,
Lo que no llego a comprender es porque el control original no tiene el DoubleBuffered ON, maldito Microsoft, en fin!!.

Un saludo.
los controles de windows son controles standards, por eso muchas veces se recurren a clases extendidas de las originales o simplemente controles de terceros :)