2011-08-31 8 views
1

Je suis tout nouveau dans cette entreprise treeview. J'ai une arborescence fixe, très simple et basique. Seulement deux niveaux, les nœuds parent et enfant. J'ai juste besoin de deux choses hors de cette arborescence.Vérification des noeuds Treeview

1) Si le parent est coché, vérifiez tous les nœuds enfants.

2) Si un seul nœud enfant est décoché, décochez le nœud parent.

C'est tout! J'ai cherché cela pendant 30 minutes et je ne peux pas le trouver. Peut-être parce que mon vb.net est vieux, il ne semble pas être le même que d'autres =/J'utilise vb.net 2003. Merci beaucoup: D

Répondre

3

Exemple de travail dans VB.Net 2008, mais il devrait travail en 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

cela fonctionne. après avoir peaufiné un peu. Si non e.Node.Checked AndAlso e.Node.Parent IsNot rien alors à Si e.Node.Checked = False Et (e.Node.Parent Is Nothing = False) Alors –

+0

1 chose, comment puis-je vérifier le parent s'il arrive que tous les nœuds enfants soient vérifiés? –

+0

@Paul VB2003 n'a pas AndAlso ou IsNot? J'ai oublié cela. – LarsTech

1

Vous pouvez essayer cette version plus courte

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

cela fonctionne sur VB.net 2010. il est basé sur le code Daniel Lee

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

J'avais fondamentalement la même exigence, mais je voulais aussi que si tous les nœuds enfants sont vérifiés, vérifiez le nœud parent.

Voici mon code testé aujourd'hui dans 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

Je dois ajouter qu'il est non récursif, donc il ne fonctionne que sur deux niveaux. –

Questions connexes