PowerShell .NET收集所有选中的节点

时间:2015-01-12 14:58:01

标签: .net winforms forms powershell

我差不多用我的小GUI来选择treeview中的内容。剩下的唯一障碍是收集在它们前面有复选标记的所有节点。点击“ButtonOK”后我试图这样做,但我的Foreach并没有真正起作用。

代码:

$ButtonOK_Click = {
    foreach ($n in $treeView.Nodes) {
        if ($n.checked) {
            Write-Output $n.Name
        }
    }
}

$form = New-Object System.Windows.Forms.Form
$Form.ClientSize = '342, 502'
$Form.FormBorderStyle = 'FixedDialog'

$treeView = New-Object System.Windows.Forms.TreeView
$treeView.Dock = 'Fill'
$treeView.CheckBoxes = $true

$N1 = $treeView.Nodes.Add('Node 1') 
$N2 = $treeView.Nodes.Add('Node 2')
$N3 = $treeView.Nodes.Add('Node 3')

$newNode = New-Object System.Windows.Forms.TreeNode  
$newNode.Name = 'Sub 1'
$newNode.Text = 'Sub 1'
$N1.Nodes.Add($newNode) | Out-Null

$newNode = New-Object System.Windows.Forms.TreeNode  
$newNode.Name = 'Node 1 Sub 2'
$newNode.Text = 'Node 1 Sub 2'
$N1.Nodes.Add($newNode) | Out-Null #>

$ButtonOK = New-Object System.Windows.Forms.Button
$ButtonOK.DialogResult = 'OK'
$ButtonOK.Location = '245,467'
$ButtonOK.Size = '75,23'
$ButtonOK.Name = 'ButtonOK'
$ButtonOK.Text = 'OK'
$ButtonOK.add_Click($ButtonOK_Click)
$form.Controls.Add($ButtonOK)

$form.Controls.Add($treeView)
$form.ShowDialog()

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

在C#here

中有一个很好的例子

以下是Powershell中的翻译:

function GetCheckedNode
{
    param($nodes)

    foreach ($n in $Nodes) {
        if ($n.nodes.count -gt 0)
        {
            GetCheckedNode $n.nodes
        }
        if ($n.checked) {
            Write-Host $n.Text
        }           
    }   
}
$ButtonOK_Click = {
    GetCheckedNode $treeView.Nodes
}

$form = New-Object System.Windows.Forms.Form
$Form.ClientSize = '342, 502'
$Form.FormBorderStyle = 'FixedDialog'

$treeView = New-Object System.Windows.Forms.TreeView
$treeView.Dock = 'Fill'
$treeView.CheckBoxes = $true

$N1 = $treeView.Nodes.Add('Node 1') 
$N2 = $treeView.Nodes.Add('Node 2')
$N3 = $treeView.Nodes.Add('Node 3')

$newNode = New-Object System.Windows.Forms.TreeNode  
$newNode.Name = 'Sub 1'
$newNode.Text = 'Sub 1'
$N1.Nodes.Add($newNode) | Out-Null

$newNode = New-Object System.Windows.Forms.TreeNode  
$newNode.Name = 'Node 1 Sub 2'
$newNode.Text = 'Node 1 Sub 2'
$N1.Nodes.Add($newNode) | Out-Null #>

$ButtonOK = New-Object System.Windows.Forms.Button
$ButtonOK.DialogResult = 'OK'
$ButtonOK.Location = '245,467'
$ButtonOK.Size = '75,23'
$ButtonOK.Name = 'ButtonOK'
$ButtonOK.Text = 'OK'
$ButtonOK.add_Click($ButtonOK_Click)
$form.Controls.Add($ButtonOK)

$form.Controls.Add($treeView)
$form.ShowDialog()

答案 1 :(得分:1)

由于某种原因,我无法访问Name属性,但Text属性确实有效。您需要从按钮单击处理程序调用一个函数,该处理程序将递归自身以获取所有节点。完整代码如下:

Add-Type -AssemblyName System.Windows.Forms

function findChecked($node) {
  foreach ($n in $node.nodes) {
    if ($n.checked) { write-host $n.Text }
    findChecked($n)
  }
}

$form = New-Object System.Windows.Forms.Form
$Form.ClientSize = '342, 502'
$Form.FormBorderStyle = 'FixedDialog'

$treeView = New-Object System.Windows.Forms.TreeView
$treeView.Dock = 'Fill'
$treeView.CheckBoxes = $true

$N1 = $treeView.Nodes.Add('Node 1') 
$N2 = $treeView.Nodes.Add('Node 2')
$N3 = $treeView.Nodes.Add('Node 3')

$newNode = New-Object System.Windows.Forms.TreeNode  
$newNode.Name = 'Sub 1'
$newNode.Text = 'Sub 1'
$N1.Nodes.Add($newNode) | Out-Null

$newNode = New-Object System.Windows.Forms.TreeNode  
$newNode.Name = 'Node 1 Sub 2'
$newNode.Text = 'Node 1 Sub 2'
$N1.Nodes.Add($newNode) | Out-Null #>

$ButtonOK_Click = {
    findChecked($treeView)
}

$ButtonOK = New-Object System.Windows.Forms.Button
$ButtonOK.DialogResult = 'OK'
$ButtonOK.Location = New-Object System.Drawing.Point(245,467)
$ButtonOK.Size = New-Object System.Drawing.Size(75,23) 
$ButtonOK.Name = 'ButtonOK'
$ButtonOK.Text = 'OK'
$ButtonOK.UseVisualStyleBackColor = $True
$ButtonOK.add_Click($ButtonOK_Click)
$form.Controls.Add($ButtonOK)

$form.Controls.Add($treeView)
$form.ShowDialog()