Foro de elhacker.net

Programación => .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
  1. for each file....
  2.  
  3.                Problems += 1
  4.                str(0) = Problems
  5.                str(1) = str(1).Substring(2)
  6.                str(2) = File.FullName
  7.                itm = New ListViewItem(str)
  8.                InvokeControl(ListView, Sub(x) x.BeginUpdate())
  9.                InvokeControl(ListView, Sub(x) x.Items.Add(itm))
  10.                InvokeControl(ListView, Sub(x) x.EnsureVisible(ListView.Items.Count - 1))
  11.                InvokeControl(ListView, Sub(x) x.EndUpdate())
  12. end for...
  13.  

Esto es otra variante del código, aquí noto cierta mejora (Flashes más cortos):
Código
  1.   Private Sub AddItemToListView()
  2.        str(0) = Problems
  3.        str(1) = str(1).Substring(2)
  4.        str(2) = File.FullName
  5.        itm = New ListViewItem(str)
  6.        ListView.SuspendLayout()
  7.        InvokeControl(ListView, Sub(x) x.BeginUpdate())
  8.        InvokeControl(ListView, Sub(x) x.Items.Add(itm))
  9.        InvokeControl(ListView, Sub(x) x.EnsureVisible(ListView.Items.Count - 1))
  10.        InvokeControl(ListView, Sub(x) x.EndUpdate())
  11.        ListView.ResumeLayout()
  12.        If NumberIsOdd(Problems) Then
  13.            itm.BackColor = Color.FromArgb(15, 15, 15)
  14.        Else
  15.            itm.BackColor = Color.FromArgb(30, 30, 30)
  16.        End If
  17.    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
  1.    Public Class ListviewEx
  2.        Inherits ListView
  3.  
  4.        Public Sub New()
  5.            MyBase.New()
  6.            Me.DoubleBuffered = True
  7.        End Sub
  8.    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
  1. 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
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 :)