2015-01-12 27 views
2

在我們Windows.Forms形式默認複選框行爲,我們正在努力實現以下目標:PowerShell的.NET模仿Windows爲TreeNodes的

  1. 檢查/取消所有當您檢查/取消父節點的子節點。
  2. 自動檢查父節點是否檢查了其所有子節點。
  3. 如果未選中某個子節點,則自動取消選中父節點。

測試代碼:

$form = New-Object System.Windows.Forms.Form 

$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 = 'Node 1 Sub 1' 
$newNode.Text = 'Node 1 Sub 1' 
$N1.Nodes.Add($newNode) 

$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 
# There can be deeper levels of treenodes 

$TV_AfterCheck = { 
    if($_.Node.Checked) { 
     #[System.Windows.Forms.MessageBox]::Show('Node ' + $_.Node.Text + ' checked') 
    } 
    else { 
     #[System.Windows.Forms.MessageBox]::Show('Node ' + $_.Node.Text + ' unchecked') 
    } 
} 

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

我找到了解決方案是專爲另一種語言,我不能讓它在PowerShell中工作。關於這個主題有很多信息,但它都是用其他編程語言編寫的。

解決方案的另一種語言:

Private Sub CheckChildNode(ByVal currNode As TreeNode) 
'set the children check status to the same as the current node 
Dim checkStatus As Boolean = currNode.Checked 
For Each node As TreeNode In currNode.Nodes 
node.Checked = checkStatus 
CheckChildNode(node) 
Next 
End Sub 

Private Sub CheckParentNode(ByVal currNode As TreeNode) 
Dim parentNode As TreeNode = currNode.Parent 
If parentNode Is Nothing Then Exit Sub 
parentNode.Checked = True 
For Each node As TreeNode In parentNode.Nodes 
If Not node.Checked Then 
parentNode.Checked = False 
Exit For 
End If 
Next 
CheckParentNode(parentNode) 
End Sub 

Private Sub treeview_AfterCheck(ByVal sender As System.Object, ByVal e As 
System.Windows.Forms.TreeViewEventArgs) Handles treeview.AfterCheck 
RemoveHandler treeview.AfterCheck, AddressOf treeview_AfterCheck 
CheckChildNode(e.Node) 
CheckParentNode(e.Node) 
AddHandler treeview.AfterCheck, AddressOf treeview_AfterCheck 
End Sub 

這真的是巨大的,如果有人可以幫助我將其粘貼在一起,所以它會在PowerShell中工作。感謝您的幫助。

+0

這不是C#... – arco444

回答

3

下面基本上包含的是VB.NET代碼的重寫:

您需要包括以下功能:

function checkChildNode($node) { 
$checkStatus = $node.checked 
    foreach ($n in $node.nodes) { 
    $n.checked = $checkstatus 
    checkChildNode($n) 
    } 
} 

function checkParentNode($node) { 
$parent = $node.parent 
if($parent -eq $null) { 
    return 
} 
$parent.checked = $true 
foreach ($n in $parent.nodes) { 
    if(!$n.checked) { 
     $parent.checked = $false 
     break 
    } 
    } 
    checkparentNode($parent) 
} 

,改變你的事件處理程序是:

$TV_AfterCheck = { 
    $treeView.Remove_AfterCheck($TV_AfterCheck) 
    checkChildNode($_.node) 
    checkParentNode($_.node) 
    $treeView.Add_AfterCheck($TV_AfterCheck) 
} 

這會給你你以後的行爲。

+0

謝謝你Arco444,它幾乎是完美的:)當我檢查'節點1'它確實檢查所有它的子節點正確。但是,當我僅取消選擇「節點1」(例如,節點1子1)的一個子節點時,它們全部未被選中。 – DarkLite1

+0

啊,我誤解了。編輯有幫助嗎? – arco444

+0

完美!像一個老闆一樣!謝謝Arco444 :) – DarkLite1