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.
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):
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?
se llama flickering, y lo evitas creando una clase que herede del listview comun, y asi le podes asignar la variable DoubleBuffered.
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:
Private WithEvents lvPedidos As ListviewEx
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.
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 :)