Autor Beitrag
karstenK
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 18.04.12 14:02 
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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 102
Erhaltene Danke: 12



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 19.04.12 15:35 
Vielen Dank für die Antworten. Der Tipp mit dem Timer war klasse.