2011-08-31 116 views
1

我对这个treeview业务都很陌生。我有一个固定的树视图,非常简单和基本。只有两个级别,父节点和子节点。我只需要这个树视图中的两件事。检查Treeview节点

1)如果选中了父项,请检查所有子节点。

2)如果只有一个子节点未选中,请取消选中父节点。

就是这样!我一直在寻找这个30分钟,我无法找到它。也许是因为我的vb.net是旧的,它似乎没有像其他人一样= /我使用vb.net 2003.非常感谢:D

回答

3

在VB.Net 2008中的工作示例,但它应在2003工作:

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") 
    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 

    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 
+0

它的工作原理。稍微调整一下。 如果不e.Node.Checked AndAlso e.Node.Parent IsNot运算没有那么 到 如果e.Node.Checked =虚假和(e.Node.Parent是没什么= FALSE)然后 –

+0

1件事,怎么如果发生所有子节点都被检查,我会检查父母吗? –

+0

@Paul VB2003没有AndAlso或IsNot?我忘了那个。 – LarsTech

1

你可能想试试这个较短的版本

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

    Dim objNode As TreeNode = e.Node 
    Dim bCheck As Boolean = e.Node.Checked 

    For Each ChildNode As TreeNode In objNode.Nodes 
     ChildNode.Checked = bCheck 
    Next 
End Sub 
0

此工程于2010年VB.net它是基于李仁代码

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 
1

我基本上有相同的要求,但我也希望如果所有的子节点都选中,请检查父节点。

这里是我的代码测试今天在VS 2013:

Private Sub TreeView1_AfterCheck(sender As Object, e As TreeViewEventArgs) Handles TreeView1.AfterCheck 
    If e.Action <> TreeViewAction.ByMouse And e.Action <> TreeViewAction.ByKeyboard Then Exit Sub 

    Dim CheckedNode As TreeNode = e.Node 
    Dim CheckedNodeIsRoot As Boolean = CheckedNode.Parent Is Nothing 
    Dim ParentNode As TreeNode = CheckedNode.Parent 

    Dim ChildOneUnchecked As Boolean = False 

    If CheckedNodeIsRoot Then 
     For Each ChildNode As TreeNode In CheckedNode.Nodes 
      ChildNode.Checked = CheckedNode.Checked 
     Next 
    Else 
     If CheckedNode.Checked Then 
      For Each ChildNode As TreeNode In ParentNode.Nodes 
       If Not ChildNode.Checked Then ChildOneUnchecked = True 
      Next 
      If ChildOneUnchecked Then 
       ParentNode.Checked = False 
      Else 
       ParentNode.Checked = True 
      End If 
     Else 
      ParentNode.Checked = False 
     End If 
    End If 
End Sub 
+0

我必须补充说它是非递归的,所以它只能在两个层次上工作。 –