Entwickler-Ecke

WinForms - ListBox ändern mit Invoke geht nur teilweise


huuuuuh - Di 20.07.10 12:57
Titel: ListBox ändern mit Invoke geht nur teilweise
hallo, hab schon vieles ausprobiert, komme aber im moment echt nicht weiter...
ich hab nen kleines chatprogramm mit c# geschrieben. das problem hat aber garnix mit netzwerk zu tun...
sondern damit, dass ich mehrere threads verwende. die komponenten kann ich aber nur aus dem hauptthread direkt ansprechen, deshalb hab ich nen wenig gesucht und bin auf Invoke() gestossen. das is dabei rausgekommen:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
private void update_userlist(string[] userlist) //userlist_box ist die Listbox
        {
            if (userlist_box.InvokeRequired)
            {
                this.userlist = userlist;
                userlist_box.Invoke(new MethodInvoker(update_userlist_invoke));
            }
            else
            {
                this.userlist = userlist;
                userlist_box.Text="";
                for (int i = 0; i < userlist.Length; i++)
                {
                    try
                    {
                        userlist_box.Items.Add(userlist[i]);
                    }
                    catch
                    {
                    }
                }
                
            }
        }

        private void update_userlist_invoke()
        {
            userlist_box.Text=""; //macht es nicht
            for (int i = 0; i < userlist.Length; i++)
            {
                try
                {
                    userlist_box.Items.Add(userlist[i]); //das macht es seltsamerweise
                }
                catch
                {
                }
                
            }
        }

problem: die markierte stelle wird irgendwie nicht ausgeführt. oder interessiert die Listbox nich. userlist enthält auf jeden fall immer die richtigen werte...
PS: hab auch schon ResetText() versucht, um die Listbox zu leeren. kein erfolg...


Th69 - Di 20.07.10 13:36

Um die ListBox zu leeren, mußt du

C#-Quelltext
1:
listbox.Items.Clear();                    

aufrufen.

Das Setzen von ListBox.Text macht nicht das, was du denkst:
MSDN hat folgendes geschrieben:

Ruft den Text des derzeit in ListBox ausgewählten Elements ab oder sucht diesen.


P.S: Außerdem ist deine Invoke-Methode umständlich.
Es wäre besser, du definierst dir ein passendes Delegate und rufst die selbe Methode damit auf (anstatt eine andere Methode und die Parameter als Klassenmember zu setzen - bei mehreren Threads geht das nämlich in die Hose...):

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
delegate void UpdateUserListDelegate(string[] userlist);

private void update_userlist(string[] userlist) //userlist_box ist die Listbox
{
    if (userlist_box.InvokeRequired)
    {
        userlist_box.Invoke(new UpdateUserListDelegate(update_userlist), new Object[] { userlist });
    }

    ...
}


Christoph1972 - Di 20.07.10 13:37

Hi,

listbox.Text = ffgfg betrifft das selektierte Item. Listbox.Clear schon getestet? (sorry habe nur eine Hand frei, habe mein Kind aufm Arm und kann gerade nichr testen) Das TryCatch ist so übrigens Aa...


huuuuuh - Di 20.07.10 13:47

danke euch beiden. ListBox.Items.Clear() hats gebracht :autsch:
@th69: danke für den code-schnippsel. werd mir das mal anschaun...
edit: das mit dem try catch stimmt. is ziemlich unnötig. keine ahnung warum ich es reingebaut hab :autsch: