【问题标题】:How can i get the current node from context menu in a TreeView in Powershell?如何从 Powershell 的 TreeView 的上下文菜单中获取当前节点?
【发布时间】:2018-02-12 12:32:31
【问题描述】:

我在 powershell 中创建了一个树视图,并在每个项目中添加了一个上下文菜单。 我现在尝试获取,当我单击上下文菜单项时,选定的节点。

$ctxCreateSiteMenuItem = New-Object System.Windows.Forms.MenuItem
$ctxCreateSiteMenuItem.Text = "Create a site"        
$ctxCreateSiteMenuItem.Add_Click({CreateSite $this.Parent.Node})

当我查看 $this 时,它是我当前的上下文菜单项。 $this.Parent 这是我的上下文菜单项列表。 $this.Parent.parent 返回空值。 在 c# ou VB 中,解决方案非常简单,因为您可以访问发件人,但在这里我找不到方法。 有关信息,我右键单击以打开上下文菜单。我已经尝试选择一个节点并在打开上下文菜单后但它不起作用。

function CreateSite{
param ( 
            $selectedNode,
            $sender,
            $eargs          
        )

Write-host $sender
Write-host $eargs

【问题讨论】:

  • add_Click({param($sender,$eargs) <# use $sender in here #>})
  • 我将其添加为参数,但值为空。也许我做错了。
  • Sender 或 $this 终于一样了。我在同一点@MathiasR.Jessen

标签: winforms powershell treeview


【解决方案1】:

如何将右键单击的(不一定是选定的)节点存储在全局变量中 - 这不是很好,但它可以工作:

$Form = New-Object System.Windows.Forms.Form
$Form.Text = "Form1"
$Form.Size = New-Object System.Drawing.Size(600, 300)

$TreeView = New-Object System.Windows.Forms.TreeView
$TreeView.Location = New-Object System.Drawing.Point(12, 12)
$TreeView.Size = New-Object System.Drawing.Size(500, 200)
$Form.Controls.Add($TreeView)

$rootNode = New-Object System.Windows.Forms.TreeNode
$rootNode.text = "Root"
$rootNode.name = "RootName"
[void]$TreeView.Nodes.Add($rootNode)

for ($i=0; $i -lt 6; $i++) {
    $subNode = New-Object System.Windows.Forms.TreeNode
    $subNode.text = "Node{0}" -f $i
    $subNode.name = "NodeName{0}" -f $i
    [void]$rootNode.Nodes.Add($subNode)
}

$ctxMenu = New-Object System.Windows.Forms.ContextMenu
$ctxCreateSiteMenuItem = New-Object System.Windows.Forms.MenuItem
$ctxCreateSiteMenuItem.Text = "Create a site"        
$ctxCreateSiteMenuItem.add_Click({ param($sender, $eargs)
    Write-Host "SelectedNode: $global:selectedNode"
})
$ctxMenu.MenuItems.AddRange(@($ctxCreateSiteMenuItem))

$TreeView.ContextMenu = $ctxMenu

$TreeView.add_NodeMouseClick({ param($sender, $eargs)
    $global:selectedNode = $eargs.Node
})

$rootNode.Expand()

# Show Form // this always needs to be at the bottom of the script!
$Form.Add_Shown({$Form.Activate()})
[void] $Form.ShowDialog()

【讨论】:

  • 是的,我终于做到了,我将 treeview 变量放在全局变量中,然后使用 Treeview.SelectedNode 获取选定节点
  • 我现在的问题是我需要在右键单击之前左键单击以设置 selectedNode。
  • add_NodeMouseClick 是右击还是左击?
  • 是的。我在上面写的特别不是要求你先左键单击节点,因为听起来你不想要那个。如果您左键单击或右键单击,add_NodeMouseClick 会设置全局变量,但如果您将代码放在菜单项的 add_Click 中,并在那里使用全局变量,则只有在选择菜单项本身时才有效。跨度>
  • 如果您希望该节点成为选定节点,当有人右键单击它时,您可以在 add_NodeMouseClick 中设置$sender.SelectedNode = $eargs.Node,然后在您的add_Click 处理程序中使用 SelectedNode。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多