how to avoid flickering in listview?

J

Joaquin Grech

Hi

I did alot of research on this on the web and msdn and I couldn't find
anything.

I have a listview showing as a grid (table looking, with rows and columns
and no images at all, only text). I get the information to display on the
listview from the network and I add items often and stuff.

But more than adding items, what worries me is the step of modifying items.
I change the text of one of the columns for every row every 2 seconds.
Something like: "Time to next update: X seconds"
and that text changes every 2 seconds.

Every time i change the text, the item flickers. When I have 50 rows the
screen looks like a discoteque so it is not good.

I found lot of examples on avoiding flickering but most of them don't work,
are not correctly implemented or are thought for other
circunstances/controls.

I found that I could extend the listview control and add this to my
constructor:
this.SetStyle(ControlStyles.DoubleBuffer |

ControlStyles.UserPaint |

ControlStyles.AllPaintingInWmPaint,

true);

this.UpdateStyles();



that should enable double buffering, but i don't know how to draw the items
manually from there.



Any help would be greatly appreciated.



Joaquin Grech
 
A

Alan Pretre

Joaquin Grech said:
Every time i change the text, the item flickers. When I have 50 rows the
screen looks like a discoteque so it is not good.

See BeginUpdate() and EndUpdate().

-- Alan
 
J

Joaquin Grech

Just to make myself clear, I call this every 2 seconds:

listView1.BeginUpdate();

foreach (ListViewItem aux in listView1.Items)

{

aux.SubItems[3].Text="some changing text here";

}

listView1.EndUpdate();



I thought this would stop the flickering by using beginupdate/endupdate but
the flickering is still there... any ideas?



Joaquin Grech
 
C

Cybertof

Maybe

listView1.SuspendLayout();
....
....
listView1.ResumeLayout();

?

Cybertof.
 
J

Joaquin Grech

nice try, but nope

Cybertof said:
Maybe

listView1.SuspendLayout();
...
...
listView1.ResumeLayout();

?

Cybertof.


creative1 said:
Just to make myself clear, I call this every 2 seconds:

listView1.BeginUpdate();

foreach (ListViewItem aux in listView1.Items)

{

aux.SubItems[3].Text="some changing text here";

}

listView1.EndUpdate();



I thought this would stop the flickering by using beginupdate/endupdate but
the flickering is still there... any ideas?
 
J

Joaquin Grech

should i give up on this?

I got tons of samples on the web using lockwindowupdate, setstyle and other
wonderful stuff like handleing WM_PAINT and erasebg... nothing worked.

Anyone has a code that would make something as simple as this on a listview
work without flickering?

foreach (ListViewItem aux in listView1.Items)

{

aux.SubItems[3].Text="some changing text here";

}

looks simple? well... i found 250 posts from people with similar problems
and no one single one answered right :(

I guess the right solution would be using
this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint, true);

and drawing all the list items manually, but I have no idea how to do this.

Any code would be greatly appreciated.

Joaquin Grech
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top