elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  [SOLUCIONADO] ¿Como evitar el efecto Flashing de un listview?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [SOLUCIONADO] ¿Como evitar el efecto Flashing de un listview?  (Leído 3,278 veces)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
[SOLUCIONADO] ¿Como evitar el efecto Flashing de un listview?
« 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?


« Última modificación: 31 Diciembre 2012, 13:35 pm por EleKtro H@cker » En línea

seba123neo


Desconectado Desconectado

Mensajes: 3.621



Ver Perfil WWW
Re: ¿Como evitar el efecto Flashing de un listview?
« Respuesta #1 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


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: ¿Como evitar el efecto Flashing de un listview?
« Respuesta #2 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.
En línea

spiritdead

Desconectado Desconectado

Mensajes: 296


Ver Perfil
Re: ¿Como evitar el efecto Flashing de un listview?
« Respuesta #3 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 :)
En línea

Facilitador De Tareas - Task Simplifier (FDT)
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines