Laden...

Flimmern im ListView verhindern

Erstellt von steschu vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.563 Views
steschu Themenstarter:in
24 Beiträge seit 2009
vor 14 Jahren
Flimmern im ListView verhindern

Hallo,

Ich führe einen Verzeichnis-Vergleich aus schreibe einen Bericht in eine ListView. Die Methode, die den Verzeichnisvergleich macht, liegt in einem eigenen Thread. Dort "befülle" ich über

this.Invoke(...

meine ListView, in dem diese Methode aufgerufen wird:


private void writeLog(string sourceName, string targetName, string statusName, Color color)
        {
            listView1.SuspendLayout();
            listView1.BeginUpdate();

            ListViewItem li = new ListViewItem(sourceName);
            li.SubItems.Add(targetName);
            li.SubItems.Add(statusName);

            li.BackColor = color;

            listView1.Items.Add(li);
            listView1.EndUpdate();
            listView1.ResumeLayout();
        }

Leider flackert das ListView ohne Ende... Ist das normal? Gibt es nicht die Möglichkeit nur das neu hinzugefügte Item einzuzeichnen? Der Rest bleibt ja immer gleich...

K
62 Beiträge seit 2009
vor 14 Jahren

Da Du die writeLog-Methode für jedes Item extra aufrufst, hat dein Begin/EndUpdate so ziemlich gar keinen Effekt, da Du letztenendes ja doch immer nur ein Item hinzufügst. Der Effekt ist also derselbe als wenn Du es ganz weglassen würdest.

Eine kleine Verbesserung wäre vielleicht zumindest eine Liste, in der dein Thread die Items hinzufügen kann, und Du aus dieser Liste dann alle x Items deine ListView aktualisierst (bzw. sobald dein Thread fertig ist, alle restlichen Items).

3.511 Beiträge seit 2005
vor 14 Jahren

Du könntest DoubleBuffer für die ListView mal aktivieren. Das funktioniert allerdings nur ein einer abgeleiteten ListView, da die Eigenschaft protected ist.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

I
1 Beiträge seit 2010
vor 14 Jahren

Du musst nicht unbedingt das Listview-Control ableiten.
Stattdessen kannst du das mit diesem Trick umgehen:

public static void SetDoubleBuffered(Control control)
{
  typeof(Control).InvokeMember("DoubleBuffered",
      BindingFlags.SetProperty | BindingFlags.Instance | BindingFlags.NonPublic,
      null, control, new object[] { true });
}

Bis dann

ichbinzz

steschu Themenstarter:in
24 Beiträge seit 2009
vor 14 Jahren

Ich benutze jetzt die DataGridView, nach dem ich an anderer Stelle (z.B. Listview Flackert, egal was ich mache) immer wieder von Schwierigkeiten mit dem ListView gelesen habe...