2017-09-04 2 views
1

Je crée une arborescence dans PowerShell et j'ai ajouté un menu contextuel dans chaque élément. J'essaie d'obtenir maintenant, quand je clique sur un élément du menu contextuel, le nœud sélectionné.Comment puis-je obtenir le nœud actuel à partir du menu contextuel dans un TreeView dans Powershell?

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

Lorsque j'ai regardé $ this, c'est mon élément de menu contextuel actuel. $ this.Parent c'est ma liste d'éléments du menu contextuel. $ this.Parent.parent renvoie une valeur vide. Dans C# ou VB la solution est vraiment facile parce que vous avez accès à l'expéditeur mais ici je ne trouve pas un moyen de le faire. Pour information, je fais clic droit pour ouvrir le menu contextuel. J'ai déjà essayé de sélectionner un noeud et après avoir ouvert le menu contextuel, mais cela n'a pas fonctionné.

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

Write-host $sender 
Write-host $eargs 
+0

'add_Click ({PARAM ($ sender, $ eargs) <# utiliser $ expéditeur ici #>}) ' –

+0

Je l'ajoute en paramètre mais la valeur est vide. Peut-être que je me trompe. – MatDev8

+0

Sender ou $ c'est finalement la même chose. Je suis au même point @ MathiasR.Jessen – MatDev8

Répondre

0

Que diriez-vous de stockage du droit clicked (pas nécessairement sélectionné) noeud dans une variable globale - ce n'est pas agréable, mais cela fonctionne:

$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() 
+0

Ouais enfin je l'ai fait, je mets le treeview varable global et j'obtiens le noeud sélectionné en utilisant Treeview.SelectedNode – MatDev8

+0

Le problème que j'ai maintenant est que je dois cliquer gauche avant de cliquer droit pour définir le noeud selected. – MatDev8

+0

L'add_NodeMouseClick est à droite comme à gauche? – MatDev8