forms - Anonymous clickhandler in foreach loop uses last variable state -


i guess newbie question. yet did not find online...

i'm creating small powershell script simple gui.

this relevant part of script:

foreach ($script in $scripts){   $btn = new-object system.windows.forms.button     #text, location, size omitted    #add clickhandler   $btn.add_click(     {           write-host "clicked on btn $script"       start-process -filepath "powershell" -argumentlist "-command", "`"$script`""       write-host "finished"       $form.close();     }   )   $form.controls.add($btn) } 

obviously $scripts contains paths pointing towards other powershell scripts. being java developer naiv enough suspect every click handler created own reference script location ($script).

but of course powershell not evaluate $script until handler invoked. thus, every button call last element in array $scripts since $script reference last element in $scripts after loop completes.

how can create click handler inside foreach-loop based on loop-variable itself?

solution

mathias r. jessen pointed me working solution. .getnewclosure() called on handler worked.

working code:

foreach ($script in $scripts){   $btn = new-object system.windows.forms.button     #text, location, size omitted    #add clickhandler   $btn.add_click(     {           write-host "clicked on btn $script"       start-process -filepath "powershell" -argumentlist "-command", "`"$script`""       write-host "finished"       $form.close();     }.getnewclosure()   )   $form.controls.add($btn) } 

solution

mathias r. jessen pointed me working solution. .getnewclosure() called on handler worked.

working code:

foreach ($script in $scripts){   $btn = new-object system.windows.forms.button     #text, location, size omitted    #add clickhandler   $btn.add_click(     {           write-host "clicked on btn $script"       start-process -filepath "powershell" -argumentlist "-command", "`"$script`""       write-host "finished"       $form.close();     }.getnewclosure()   )   $form.controls.add($btn) } 

Comments

Popular posts from this blog

Is there a better way to structure post methods in Class Based Views -

performance - Why is XCHG reg, reg a 3 micro-op instruction on modern Intel architectures? -

jquery - Responsive Navbar with Sub Navbar -