Avatar billede Slettet bruger
02. januar 2007 - 10:18 Der er 7 kommentarer og
1 løsning

Flicker Free listview

Jeg har søgt en hel del på google, og fundet eksempler, men jeg kan ikke finde en ordenlig løsning. Hvordan laver jeg et listview uden flicker, eller er der nogle der har et godt link? :)
Avatar billede Syska Mester
02. januar 2007 - 12:15 #1
altså.... du mener når du opdatere ... det skulle gerne gøre så det ikke flicker ...

listview1.BeginUpdate();
// opdater ting i view
listview1.EndUpdate();

// ouT
Avatar billede Slettet bruger
02. januar 2007 - 12:19 #2
Det er når man tilføjer mange items. Problemet ligger i at den til tilføje og vise dem efterhånden som de bliver added
Avatar billede Syska Mester
02. januar 2007 - 12:21 #3
nej, ikke hvis du bruger overstående ... det gør det mange gange hurtigere at tilføje da den ikke laver en redraw af din control før end du kalde EndUpdate igen ...

// ouT
Avatar billede Slettet bruger
02. januar 2007 - 13:49 #4
Tror ikke du forstår, jeg vil gerne have en viser itemsne efterhånden som de bliver fundet. Problemet er at når man laver Items.Add på listview, så redrawer den alle items for hver gang, og det er det der gør at det blinker. Med BeginUpdate vises listen ikk før du kalder EndUpdate.

Jeg fandt denne løsning som virker helt perfekt (med den rette opdatering af .net 2.0)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace FFListview
{
    public class FFListview : System.Windows.Forms.ListView
    {
        public FFListview()
        {
            //Activate double buffering
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);

            //Enable the OnNotifyMessage event so we get a chance to filter out
            // Windows messages before they get to the form's WndProc
            this.SetStyle(ControlStyles.EnableNotifyMessage, true);
        }

        protected override void OnNotifyMessage(Message m)
        {
            //Filter out the WM_ERASEBKGND message
            if (m.Msg != 0x14)
            {
                base.OnNotifyMessage(m);
            }
        }
    }
}


Jeg laver en udvidet control at listview, og sørger for at WM_ERASEBKGND ikke kaldes. Så bruger man blot dette listview i steddet.
Avatar billede Syska Mester
02. januar 2007 - 14:52 #5
Jeg forstod udemærket godt hvad du skrev ... du sagde bare ikke du genre ville have vist dine items mens den smed dem ind ... :-) big diff

Men godt at du fik det til at virke ...

Men hvis det alligevel er over 20 items, kan jeg ikke se noget grund til at tegne hele tiden ... men det er nok på den måde du bruger det i din sammenhæng jeg ikke kender, og nok derfor jeg ikke lige kan sætte mig ind i det ....

Men godt at du fik det til at virke ...

// oUT
Avatar billede Slettet bruger
02. januar 2007 - 16:20 #6
Grunden til at tegne hele tiden ville måske være at du har muluighed for at scrolle listviewet MENS den indsætter resultater.. ligsom i Windows når du søger på filer :)

Men self, hvis det bare handler om at få ting ind i listview'et hurtigt uden at man behøver at se dataerne, så er Begin og End Update en god ting, for det går nemlig ret meget hurtigere :)
Avatar billede Syska Mester
02. januar 2007 - 18:20 #7
tror der var en der havde testet lidt ... sagde det var omkring 100 gange hvis ikke mere :-P
Avatar billede Slettet bruger
19. marts 2007 - 14:27 #8
fandt selv en løsning, lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester