Entwickler-Ecke
WinForms - Alle Checkboxen eines ListViews in extra Thread anchecken
karstenK - Mi 18.04.12 14:02
Titel: Alle Checkboxen eines ListViews in extra Thread anchecken
Hallo liebe Community,
ich habe folgendes Problem, ich habe ein listview bei dem ich CheckBoxes auf True gesetzt habe. Das heisst, das jetzt für jeden Eintrageine Checkbox mit in der ersten Spalte eingefügt wird.
Ich habe nun sehr viele Einträge. Wenn ich jetzt alle auf einmal selektieren will, hängt sich der MainThread auf. Deshalb möchte ich gerne das Selektieren in einen anderen Thread auslagern. Als ich das versucht habe mithilfe eines Threads zu machen, bekam ich immer die Fehlermeldung das nicht threadübergreifend zugegriffen werden kann.
Ich habe es mal mit Actions versucht aber das klappt noch nicht.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| private void buttonAlleAuswaehlen_Click(object sender, EventArgs e) { BeginInvoke(new Action(() => { listViewResults.Enabled = false; })); BeginInvoke(new Action(() => { foreach(ListViewItem listItem in listViewResults.Items) { listItem.Checked = true; } })); BeginInvoke(new Action(() => { listViewResults.Enabled = true; }));
} |
Habt ihr vielleicht eine Idee?
Mit freunbdlcihen Grüßen
Karsten
Th69 - Mi 18.04.12 17:07
Hallo,
alle GUI Aktionen müssen auch im GUI-Thread (d.h. Main-Thread) ausgeführt werden.
Dein Workaround behebt zwar die Fehlermeldung, da durch das BeginInvoke die Aktion in den GUI-Thread verlagert wird, jedoch kannst du nichts an der Tatsache ändern, daß diese Aktion längere Zeit dauert und daher einige Zeit in Anspruch nimmt.
Die einzige Lösung die mir dazu einfällt, wäre einen Timer zu benutzen, der in kleineren Einheiten die CheckBoxes aktiviert (so daß die GUI nicht die ganze Zeit blockiert).
Merke dir einfach in einer Membervariablen den aktuellen Index und laß z.B. alle 15ms (= kleinste Timerintervall unter WinForms) 100 CheckBoxen aktivieren.
ujr - Mi 18.04.12 17:53
Hallo,
vielleicht hilft ja BeginUpdate/EndUpdate ein bisschen weiter.
Im übrigen musst Du nicht für alle aufeinanderfolgenden Aktionen ein separates BeginInvoke aufrufen.
karstenK - Do 19.04.12 15:35
Vielen Dank für die Antworten. Der Tipp mit dem Timer war klasse.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!