VB.NET - 检查子节点是不是在 TreeView 中选中

Posted

技术标签:

【中文标题】VB.NET - 检查子节点是不是在 TreeView 中选中【英文标题】:VB.NET - Check if child node if checked in TreeViewVB.NET - 检查子节点是否在 TreeView 中选中 【发布时间】:2018-07-13 18:34:34 【问题描述】:

我正在使用 Visual Basic .NET 2013,我想知道在树视图中检查了哪些子节点。我不检查父节点,因为复选框仅在子节点中(我在父节点中禁用了复选框,因此它们不会出现)。

目前我正在使用我找到的一种解决方案:

Private Sub TreeView1_AfterCheck(sender As Object, e As TreeViewEventArgs) Handles TreeView1.AfterCheck
    Dim childNodeCK As TreeNode = e.Node

    If childNodeCK.Checked = True Then
        If e.Node.Parent Is Nothing = False Then 'detects a Child Node
            TextBox1.Text = TextBox1.Text & childNodeCK.Text
            MessageBox.Show("Checked: " & childNodeCK.Text)
        End If
    End If

    If childNodeCK.Checked = False Then
        If e.Node.Parent Is Nothing = False Then
            MessageBox.Show("Unchecked: " & childNodeCK.Text)
        End If
    End If
End Sub

但我想知道是否有其他解决方案,类似这样(以下代码没有显示任何内容,因为当我单击按钮运行它时,没有任何反应):

For Each childNode As System.Windows.Forms.TreeNode In TreeView1.Nodes
        If childNode.Checked = True Then
            MessageBox.Show(childNode.Text)
        End If 
Next

因为想法是单击一个按钮并获取当时检查的子节点的名称(文本)。所以我想我必须从头到尾一个一个地检查,如果检查了子节点然后执行一些代码。

【问题讨论】:

TreeView1.Nodes 只为您提供树中的根节点。您必须指定父节点并使用其中的节点集合来检查您的子节点。还是您要求获取树中所有已检查的节点? 感谢您的回答。我有 3 个根节点,每个根节点都有自己的子节点: -Root node #1 --Child node #1 --Child node #2 --Child node #3 -Root node #2 --Child node #1 - -子节点#2 -根节点#3 --子节点#1 --子节点#2 --子节点#3 我想检查树视图中存在的所有子节点。在我刚才详述的示例中,有 8 个子节点。所以我想获取树中所有被检查的节点。 【参考方案1】:

要获取所有选中的节点,您必须使用递归函数或堆叠列表。我更喜欢后者:

Private Function GetCheckedNodes() As List(Of TreeNode)
  Dim result As New List(Of TreeNode)

  'Get the root nodes
  Dim nodes As New Stack(Of TreeNode)
  For Each tn As TreeNode In TreeView1.Nodes
    nodes.Push(tn)
  Next

  'Check each node and it's children
  While nodes.Count > 0
    Dim popNode As TreeNode = nodes.Pop
    If popNode.Checked Then
      result.Add(popNode)
    End If
    For Each tn As TreeNode In popNode.Nodes
      nodes.Push(tn)
    Next
  End While

  Return result
End Function

然后使用它:

For Each tn As TreeNode In GetCheckedNodes()
  MessageBox.Show(tn.Text)
Next

【讨论】:

完美运行。非常感谢。非常感谢你。我现在正在仔细检查代码,以了解我从未使用过的部分。 @RichardSteele Push 将节点放入列表,Pop 将其取出。 是的,我明白了。我一直在测试代码以了解更多我不知道的新特性,并且在检查代码时学到了很多东西。非常感谢。

以上是关于VB.NET - 检查子节点是不是在 TreeView 中选中的主要内容,如果未能解决你的问题,请参考以下文章

VB.net 在连接之前检查数据库是不是存在

在 SQL 和 VB.NET 中检查日期是不是小于另一个

VB.net如何动态获取菜单栏中的菜单名并用树型表示

如何检查 vb .net 项目的 sql server 中是不是存在数据库和表?

vb.net 中是不是有任何代码来检查打印机状态

如何检查字节是不是为空 vb.net