Проверка узлов Treeview - PullRequest
       1

Проверка узлов Treeview

1 голос
/ 31 августа 2011

Я новичок в этом древовидном бизнесе.У меня есть фиксированный вид дерева, очень простой и простой.Только два уровня, родительский и дочерний узлы.Мне просто нужно две вещи из этого древовидного представления.

1) Если родитель проверен, проверьте все дочерние узлы.

2) Если не проверен только один дочерний узел, снимите флажок родительского узла.*

Вот и все!Я искал это в течение 30 минут, и я не могу найти это.Возможно, из-за того, что мой vb.net старый, он не похож на другие = / Я использую vb.net 2003. Большое спасибо: D

Ответы [ 6 ]

3 голосов
/ 31 августа 2011

Рабочий пример в 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
1 голос
/ 15 октября 2015

У меня были в основном те же требования, но я также хотел, чтобы, если все дочерние узлы были проверены, проверьте родительский узел.

Вот мой код, протестированный сегодня в 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
1 голос
/ 19 октября 2011

Вы можете попробовать эту более короткую версию

   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 голосов
/ 29 ноября 2018

Я изменяю коды Хавьера Арсе для многоуровневого просмотра дерева (рекурсивная версия). Вот мои коды.

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

        CheckAllNodes(e.Node)
        CheckAllNodesForParent(e.Node)
End Sub

Public Sub CheckAllNodes(ByRef TreeNodeToCheck As TreeNode)
    Dim val As Boolean = TreeNodeToCheck.Checked
    For Each n As TreeNode In TreeNodeToCheck.Nodes
        n.Checked = val
        If n.GetNodeCount(True) > 0 Then
            CheckAllNodes(n)
        End If
    Next
End Sub

Public Sub CheckAllNodesForParent(ByRef CheckedTreeNode As TreeNode)
    If CheckedTreeNode.Checked Then
        If CheckedTreeNode.Parent Is Nothing = False Then
            Dim allChecked As Boolean = True
            For Each node As TreeNode In CheckedTreeNode.Parent.Nodes
                If Not node.Checked Then
                    allChecked = False
                End If
            Next
            If allChecked Then
                CheckedTreeNode.Parent.Checked = True
                CheckAllNodesForParent(CheckedTreeNode.Parent)
            End If
        End If
    Else
        If CheckedTreeNode.Parent Is Nothing = False Then
            CheckedTreeNode.Parent.Checked = False
            CheckAllNodesForParent(CheckedTreeNode.Parent)
        End If
    End If
End Sub
0 голосов
/ 29 марта 2018
Private Sub Tv1_AfterCheck(sender As Object, e As TreeViewEventArgs) Handles Tv1.AfterCheck
    Try
        Dim A As Boolean = e.Node.Checked
        If e.Action = TreeViewAction.ByMouse Or e.Action = TreeViewAction.ByKeyboard Then
            CUchkall(e.Node, A)
        End If
        UnCheckParentNodes(e.Node)
        Call CuChild(e.Node)
    Catch
    End Try
End Sub

Private Sub CuChild(ByVal iNode As TreeNode)
    Try
        Dim E As Boolean = True
        If iNode.Parent IsNot Nothing Then
            For Each M As TreeNode In iNode.Parent.Nodes
                If M.Checked = False Then E = False
            Next
            iNode.Parent.Checked = E
        End If
    Catch 
    End Try
End Sub

Private Sub CUchkall(ByVal iNode As TreeNode, COU As Boolean)
    Try
        If iNode.Nodes IsNot Nothing Then
            For Each N As TreeNode In iNode.Nodes
                N.Checked = COU
                Call CUchkall(N, COU)
            Next
        End If
    Catch
    End Try
End Sub

Private Sub UnCheckParentNodes(ByVal iNode As TreeNode)
    Try
        If iNode.Checked = False AndAlso iNode.Parent IsNot Nothing Then
            iNode.Parent.Checked = False
            UnCheckParentNodes(iNode.Parent)
        End If
    Catch
    End Try
End Sub
0 голосов
/ 19 сентября 2014

Это работает на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...