[C#] TreeView vullen in een eventHandler

Pagina: 1
Acties:

  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
Om C# een beetje te ontdekken ben ik me aan het wagen aan een msn-client in C#. Op zich gaat het allemaal best leuk, maar hier kom ik niet uit..
Ik wil een TreeView gebruiken als contactlist. Het toevoegen van een contact moet gebeuren als er een event wordt afgevuurd vanuit de contactlist-class (deze houdt alle info van de contacts bij etc). De code om dit te doen is als volgt:

code:
1
2
3
4
5
6
contactList.ContactAdded += new ContactList.ContactAddedHandler(this.addContact);
public void addContact( ContactList sender, ContactEventArgs e ){
    TreeNode node = new TreeNode( e.Contact.Name );
    contactListBox.Items.Add( e.Contact.Name );
    contactListView.Nodes.Add( node );
}

Bij het uitvoeren hiervan krijg ik deze error:
An unhandled exception of type 'System.InvalidOperationException' occurred in system.windows.forms.dll

Additional information: The action being performed on this control is being called from the wrong thread. You must marshal to the correct thread using Control.Invoke or Control.BeginInvoke to perform this action.
Nu moet ik dus met ContactListView.invoke() gaan spelen, maar die wil een delegate hebben (moet ik weer een delegate maken, weer een functie coden om alleen maar iets in de treeview te krijgen, en daar heb ik weinig zin in..

Is er een andere mogelijkheid? Zo ja, hoe dan? Zo nee, hoe doe ik dat precies met invoke() ??

ps. als ik deze regel: "contactListBox.Items.Add( e.Contact.Name );" weghaal werkt het wel, maar dat lijkt me ook niet helemaal de bedoeling..

[ Voor 0% gewijzigd door brammetje op 07-09-2002 04:42 . Reden: tabs weghalen.. ]


Verwijderd

De treeview is gecreeerd door thread A (je mainthread waarschijnlijk) en je wilt er iets aan toevoegen in thread B (je socketlistener waarschijnlijk). Je moet een communicatie op gang brengen tussen de twee threads. Het beste is om thread A een eventhandler te geven en die af te vuren vanuit thread B. Thread A behandelt dan de toevoeging van de node.

Dit is basic multithreading stuff: zodra je meerdere threads introduceert moet je afstappen van het idee dat alles binnen het programma van alle code is: je moet tussen threads gaan communiceren, en dat is vaak lastig maar op zich ook wel weer leuk om te ontwerpen.

  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
Het vreemde is dus dat ik helemaal nog niks doe met threads (als de library die ik gebruik die wel gebruikt merk ik dat dan??) Ook vind ik het vreemd dat als ik die dingen naar mijn listbox weghaal dat het dan gewoon werkt.

  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
ik doe het nu zo:
code:
1
2
3
4
5
6
7
8
9
10
11
        public delegate void addContactHandler ( ContactEventArgs e );

        public void addContactEventHandler( ContactList sender, ContactEventArgs e ){
            contactListBox.Items.Add( e.Contact.Name );
            contactListView.Invoke(new addContactHandler(this.addContact), new Object[1] { e });
        }

        public void addContact( ContactEventArgs e ){
            TreeNode node = new TreeNode( e.Contact.Name );
            contactListView.Nodes.Add( node );
        }


Het werkt wel, maar lijkt me zo omslachtig, dit kan echt niet beter/handiger?

[ Voor 0% gewijzigd door brammetje op 07-09-2002 14:08 . Reden: typo ]