2011-09-05 9 views
2

3 층 트리 뷰가 있으며 아래 코드를 사용하고 있습니다. 다음을 수행하도록합니다.3 개의 레이어 Treeview 노드 체크 박스

1) 상위가 선택되면 모든 하위 노드를 검사하십시오.

2) 자식 노드가 하나만 선택 취소되어 있으면 부모 노드의 선택을 취소하십시오.

3) 모든 하위 노드가 선택되면 부모 노드를 선택하십시오.

아래 코드는 2 개의 레이어에서만 작동합니다. 네가 나를 세 가지 방법으로 안내해 주시면 감사하겠습니다. treeview에 대한 많은 정보가 있지만 그들 중 대부분은 부적절한 것 같습니다.// 당신이 treeview 컨트롤에 대한 좋은 가이드를 보여줄 수 있다면 좋을 것입니다. 고맙습니다!

Private Sub TreeView1_AfterCheck(ByVal sender As Object, ByVal e As TreeViewEventArgs) Handles TreeView1.AfterCheck 
    RemoveHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck 

    For Each node As TreeNode In e.Node.Nodes 
     node.Checked = e.Node.Checked 
    Next 

    If e.Node.Checked Then 
     If e.Node.Parent Is Nothing = False Then 
      Dim allChecked As Boolean = True 

      For Each node As TreeNode In e.Node.Parent.Nodes 
       If Not node.Checked Then 
        allChecked = False 
       End If 
      Next 

      If allChecked Then 
       e.Node.Parent.Checked = True 
      End If 

     End If 
    Else 
     If e.Node.Parent Is Nothing = False Then 
      e.Node.Parent.Checked = False 
     End If 
    End If 

    AddHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck 
End Sub 

답변

6

작업을 예를 사용하여 재귀 :

Public Class Form1 

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load 
    For i As Integer = 1 To 3 
     Dim node As New TreeNode("Parent #" & i.ToString) 
     node.Nodes.Add("Child #1") 
     node.Nodes.Add("Child #2") 

     Dim childNode As New TreeNode("Child #3") 
     childNode.Nodes.Add("Grand Child #1") 
     childNode.Nodes.Add("Grand Child #2") 

     Dim grandNode As New TreeNode("Grand Child #3") 
     grandNode.Nodes.Add("Great Grand Child #1") 
     grandNode.Nodes.Add("Great Grand Child #2") 
     childNode.Nodes.Add(grandNode) 
     node.Nodes.Add(childNode) 

     grandNode.Expand() 
     childNode.Expand() 
     node.Expand() 

     TreeView1.Nodes.Add(node) 
    Next 
    End Sub 

    Private Sub TreeView1_AfterCheck(ByVal sender As Object, ByVal e As TreeViewEventArgs) Handles TreeView1.AfterCheck 
    RemoveHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck 

    Call CheckAllChildNodes(e.Node) 

    If e.Node.Checked Then 
     If e.Node.Parent Is Nothing = False Then 
     Dim allChecked As Boolean = True 
     Call IsEveryChildChecked(e.Node.Parent, allChecked) 
     If allChecked Then 
      e.Node.Parent.Checked = True 
      Call ShouldParentsBeChecked(e.Node.Parent) 
     End If 
     End If 
    Else 
     Dim parentNode As TreeNode = e.Node.Parent 
     While parentNode Is Nothing = False 
     parentNode.Checked = False 
     parentNode = parentNode.Parent 
     End While 
    End If 

    AddHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck 
    End Sub 

    Private Sub CheckAllChildNodes(ByVal parentNode As TreeNode) 
    For Each childNode As TreeNode In parentNode.Nodes 
     childNode.Checked = parentNode.Checked 
     CheckAllChildNodes(childNode) 
    Next 
    End Sub 

    Private Sub IsEveryChildChecked(ByVal parentNode As TreeNode, ByRef checkValue As Boolean) 
    For Each node As TreeNode In parentNode.Nodes 
     Call IsEveryChildChecked(node, checkValue) 
     If Not node.Checked Then 
     checkValue = False 
     End If 
    Next 
    End Sub 

    Private Sub ShouldParentsBeChecked(ByVal startNode As TreeNode) 
    If startNode.Parent Is Nothing = False Then 
     Dim allChecked As Boolean = True 
     Call IsEveryChildChecked(startNode.Parent, allChecked) 
     If allChecked Then 
     startNode.Parent.Checked = True 
     Call ShouldParentsBeChecked(startNode.Parent) 
     End If 
    End If 
    End Sub 

End Class 
+0

완벽! 이것은 treeview에 대한 매우 일반적인 용도이므로 vb.net에 사전 프로그래밍되어야합니다. 왜 수동으로 수행해야하는지 모르겠다. –

1

확인 다음 조용한 간단한 코드. 요구 사항 중 하나가 빠졌지 만 가볍고 만족 스럽습니다. VB.NET 2010.

Private Sub TreeView1_AfterCheck(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterCheck 

    Dim childNodeCK As TreeNode = e.Node 
    Dim NodeChecked As Boolean = e.Node.Checked 

    For Each ChildNode As TreeNode In childNodeCK.Nodes 
     If NodeChecked = True Then 
      ChildNode.Checked = NodeChecked 
     End If 
    Next 

    If childNodeCK.Checked = False Then 
     If e.Node.Parent Is Nothing = False Then 
      e.Node.Parent.Checked = False 
     End If 
    End If 

End Sub