winforms - SelectedNode Property Of TreeView Object Hangs The Form Multithreading -


i working on gui script , ran problem treeview object. problem occurs when try display selectednode property or try use getnodeat() method of treeview displayed in thread. able display treeview object though. sample of i'm trying do:

    $form = new-object system.windows.forms.form     $treeview = new-object system.windows.forms.treeview     $treeview.name = "tree view"     $treeview.add_afterselect({write-host $this.selectednode})     $treenode = new-object system.windows.forms.treenode     $treenode.name = "tree node"     $treenode.text = "tree node"     $treenode2 = new-object system.windows.forms.treenode     $treenode2.name = "second tree node"     $treenode2.text = "second tree node"     $treeview.nodes.addrange(@($treenode,$treenode2))     $form.controls.add($treeview)     $thread = [management.automation.runspaces.runspacefactory]::createrunspace()     $thread.open()     $thread.sessionstateproxy.setvariable("form",$form)     $thepipe = $thread.createpipeline({$form.showdialog()})     $thepipe.input.close()     $thepipe.invokeasync() 

the issue comes line $treeview.add_afterselect({write-host $this.selectednode}) when click node in treeview form hang , have kill powershell process. weird thing can display treeview object no issue. this: $treeview.add_afterselect({write-host $this}). return treeview object no issues. have tried use instead $treeview.add_nodemouseclick({write-host $this.getnodeat($_.x,$_.y)}). hang form.

the problem comes form being displayed in thread because when same code keep form in same thread have no issues displaying selected node. this:

    $form = new-object system.windows.forms.form     $treeview = new-object system.windows.forms.treeview     $treeview.name = "tree view"     $treeview.add_afterselect({write-host $this.selectednode})     $treenode = new-object system.windows.forms.treenode     $treenode.name = "tree node"     $treenode.text = "tree node"     $treenode2 = new-object system.windows.forms.treenode     $treenode2.name = "second tree node"     $treenode2.text = "second tree node"     $treeview.nodes.addrange(@($treenode,$treenode2))     $form.controls.add($treeview)     $form.showdialog() 

any appreciated. thank you!

if take @ treevieweventhandler method signature, you'll find takes 2 arguments, sender , treevieweventargs object.

you can either "intercept" these declaring own named parameters, so:

$treeview.add_afterselect({     param($s,$e)      # $e refers treevieweventargs     write-host $e.node }) 

or can rely on automatic event variables $sender , $eventargs:

$treeview.add_afterselect({     write-host $eventargs.node }) 

you may want have @ files register-objectevent , about_automatic_variables


don't use $this inside event action - it's meant used instance reference in script method definitions, so:

ps c:\> $obj = new-object psobject -property @{ number = 3 } ps c:\> $obj |add-member -type scriptmethod -name getsquare -value { return $this.number * $this.number } ps c:\> $obj.getsquare() 9 ps c:\> $obj.number = 4 ps c:\> $obj.getsquare() 16 

Comments

Popular posts from this blog

javascript - jQuery: Add class depending on URL in the best way -

caching - How to check if a url path exists in the service worker cache -

Redirect to a HTTPS version using .htaccess -