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...
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).
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)
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
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...