Neuzeichnen von Controls



  • Hallo allerseits!

    Ich will eine ListView mit mehreren 1000 Einträgen füllen, doch während des Füllvorganges flackert die ListView extrem.

    Gibt es in .NET die Möglichkeit, ein Neuzeichnen des Controls bis zu Ende einer bestimmten Aktion, in meinem Falle das Füllen der ListView, zu verhindern?

    Vielen Dank!



  • Oh soviele Einträge mache ich nie in meine ListViews
    welcher User nimmt sich da die Zeit und geht da durch um zu wählen.

    da ürde ich so ein Bereich ins Programm mit ein bauen!

    0..50
    ...
    950..1000

    über eine Button vor und Zurück kann der User dann diese Bereich verschieben
    und es wird dann immer 50 Stück von 1000 ins Listview gebracht.

    wenn Du verstehst was ich meine

    schiebst Du die in einer Schleife per Add rein
    kannst Die auch vorher in eine Array tun und
    dann
    Items.AddRange(DeinArray);
    machen ob das was hilft!?
    Wie gesagt soviele Items auf einmal halte ich für nicht sinnvoll....



  • Du könntest es während de Füllvorgang auch unsichbar machen

    ... .Visible = false;
    

    Weil wenn Du das neuzeichen verhinderst und deine Anwendung wird von einer
    anderen Anwendung verdeckt und wieder entdeckt.

    Hast Du eine hässlichen Fleck ein Loch dort wo dein Listview mal war!



  • möglichkeit wäre 2 Listview mit gleicher Grössse
    an gleicher stelle.

    Während das ein befüllt wird blendest du listview2 als FakeListview vor das was aufgefüllt wird! Klingt doof ist aber so.

    Füllvorgang fertig dann andersrum.



  • Kann das ListView nicht BeginUpdate() / EndUpdate() ?

    oder meinst du das flackern wenn das ListView im VirtualList-Mode ist und man scrollt ?



  • Oh soviele Einträge mache ich nie in meine ListViews
    welcher User nimmt sich da die Zeit und geht da durch um zu wählen.

    In meinem Falle ist die ListView sehr wohl geeignet, denn sie zeigt im allgemeinen eigentlich nur wenig Einträge. Trotzdem will ich es offen lassen, in bestimmten Fällen das Gesamtreslutat, anzuzeigen, das mitunter wesentlich größer sein kann.

    Du könntest es während de Füllvorgang auch unsichbar machen

    möglichkeit wäre 2 Listview mit gleicher Grössse
    an gleicher stelle.

    Ist das nicht etwas viel Schnickschnack für eine Sache, die in der MFC einfach mit

    BeginUpdate() / EndUpdate()

    zu bewerkstelligen war. Ich finde, diese Funktionalität ist zu wichtig, als das man es bei .NET unter den Tisch hat fallen lassen.

    Nur bin ich bis Dato nicht darauf gekommen, wie es funktioniert ... hat jemand noch weitere Vorschläge?

    Hat jemand eine Idee?



  • Das bringt mich auf eine weitere Idee!

    BeginUpdate und EndUpdate gibts dort auch.

    Laut MSDN macht BeginUpdate genau dies bis wieder EndUpdate aufgerufen wird.

    Aber trozdem man sollte auch unorthodoxe Lösungen wenn es doch mal nicht anders geht in Betracht ziehen.

    Und wenn man was von der MFC her kennt eben dochmal nach einem Wrapper schauen.

    Ich bin zwar in MFC kein Profi aber weil Du es angesprochen hast habe ich gleich mal die MSDN gefragt.

    Gruss sclearscreen

    P.S.: Lass mal die inteligente Codehilfe aufblättern wirst sehen diese Aufrufe hat das Ding auch



  • Servus,

    mich wundert es wirklich das hier noch keiner auf die folgenden zwei Methoden hingewiesen hat....

    - SuspendLayout()
    - ResumeLayout()

    mfg
    Hellsgore



  • Hellsgore schrieb:

    mich wundert es wirklich das hier noch keiner auf die folgenden zwei Methoden hingewiesen hat....

    Mich auch. 😉

    Wenn Du mit .NET 2.0 arbeitest, schau Dir mal ListView.VirtualMode an.



  • Der VirtualMode flackert bei mir beim scrollen wie blöde (ohne GridLines müsste ich das nochmal testen) 😉
    Oder gibts da auch nen Workaround zu ?

    Was genau macht ResumeLayout()/SuspendLayout() ?
    Ist das vom Prinzip her dasselbe wie BeginUpdate() / EndUpdate() ?
    Wie baut man sowas in eigene Controls ein ?



  • ich hab mal in einem project was ähnliches programmiert und dort beim listview "updaten" BeginUpdate/EndUpdate aufgerufen. hat auch alles wunderbar geklappt. wahrscheinlich dauert der aufbau bei 1000 elementen ein bisschen länger, aber man könnte während dessen z.b. eine progressbar mit dem status anzeigen (nur so als beispiel).



  • BeginUpdate und EndUpdate gibts dort auch.

    Tatsächlich! Doch im Gegensatz zur Begin-, EndUpdate in der MFC ist diese Funktion ein Member, weshalb sie mir entgangen ist.

    mich wundert es wirklich das hier noch keiner auf die folgenden zwei Methoden hingewiesen hat....

    - SuspendLayout()
    - ResumeLayout()

    Das Unterdrückt das Flackern leider überhaupt nicht ... 😞

    Trotzdem, mit Begin-, EndUpdate hab ich das richtige Mittel gefunden, vielen Dank 🙂



  • Servus,

    vergiss meinen geistigen kurz-vor-dem-Feierabend-Schwachfug Erguss....
    Ich habs mit Begin und EndUpdate verwechselt. Das kann nicht gehen. Suspend, Perform und ResumLayout ist nur zum Neuzeichnen des Controls gedacht, wenn du die Größe oder Ankerpunkte etc. veränderst.

    Zeig mir mal bitte den Quellcode, indem du gerade die ListView füllst. Das juckt mir jetzt in den Fingern. Generell habe ich damit eigentlich keine Probleme, soviele Items in die ListView zu flummen.

    mfg
    Hellsgore

    EDIT:
    Da hat sich schon einer intensiv mit beschäftigt *g*

    Teil 1: http://www.codeproject.com/cs/miscctrl/listviewxp.asp
    Teil 2: http://www.codeproject.com/cs/miscctrl/listviewff.asp

    Das ist aber für deinen Fall ein Touch übertrieben. So ein Workaround ist was für die richtig harten Fälle



  • Herzlichen dank, jedoch mein Code funktioniert bereits ... Du brauchst wirklich etwas mehr schlaf 😉

    Danke an alle und Hellsgore


Anmelden zum Antworten