Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading TreeView对象的SelectedNode属性挂起窗体多线程_Multithreading_Winforms_Powershell_Treeview - Fatal编程技术网

Multithreading TreeView对象的SelectedNode属性挂起窗体多线程

Multithreading TreeView对象的SelectedNode属性挂起窗体多线程,multithreading,winforms,powershell,treeview,Multithreading,Winforms,Powershell,Treeview,我正在编写GUI脚本,我的TreeView对象遇到了问题。当我尝试显示SelectedNode属性或尝试使用另一个线程中显示的TreeView的GetNodeAt()方法时,就会出现问题。不过,我能够显示TreeView对象本身。这是我尝试做的一个示例: $form = new-object system.windows.forms.form $treeview = new-object system.windows.forms.treeview $treeview.na

我正在编写GUI脚本,我的TreeView对象遇到了问题。当我尝试显示SelectedNode属性或尝试使用另一个线程中显示的TreeView的GetNodeAt()方法时,就会出现问题。不过,我能够显示TreeView对象本身。这是我尝试做的一个示例:

    $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()
问题来自于行
$treeview.add_afterselect({write host$this.selectednode})
当我单击树视图中的节点时,表单将挂起,我必须终止Powershell进程。奇怪的是,我可以毫无问题地显示TreeView对象。如下所示:
$treeview.add_afterselect({write host$this})
。这将返回没有问题的TreeView对象。我也试着用它来代替
$treeview.add\u nodemouseclick({write host$this.getnodeat($\ux.x,$\uy)})
。这也会把表格挂起来

问题来自于在另一个线程中显示的表单,因为当我执行相同的代码但将表单保持在同一个线程中时,显示所选节点没有问题。像这样:

    $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()
任何帮助都将不胜感激。谢谢大家!

如果查看方法签名,您会发现它包含两个参数,一个
发送方
和一个
TreeViewEventArgs
对象

您可以通过声明自己的命名参数来“拦截”这些参数,如下所示:

$treeview.add_AfterSelect({
    param($s,$e)

    # $e now refers to the TreeViewEventArgs
    Write-Host $e.Node
})
或者您可以依赖自动事件变量
$Sender
$EventArgs

$treeview.add_AfterSelect({
    Write-Host $EventArgs.Node
})
您可能需要查看和的帮助文件


不要在事件操作中使用
$this
——它是用来作为脚本方法定义中的实例引用的,如下所示:

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

您正在滥用
$this
来换取它不适合的东西。应该是
{param($s,$e)Write Host$e.Node}
哦,这很有意义。所以是$而不是$这个。谢谢你的快速回复!不,在我的示例中,$s是发送方(treeview本身),而$e是由eventoh传递的TreeViewEventArgs对象,但是$\u是eventargs,不是吗?$\。node的工作原理与$e.node相同。因为我以为$this是发送者,$\是事件。我弄错了吗?