如何link TreeView 的特定父节点到特定文件(vb.net/c#)

How to link specific parent node of a TreeView to a specific file (vb.net/c#)

我有一个 TreeView,它有 N 个父节点,每个父节点都有相同数量的子节点,如下例所示(城市 1、2、... 是父节点;子节点是房屋、酒店、商店、银行、学校);

城市1
- 房子
- 酒店
- 店铺
- 银行
- 学校
城市 2
- 房子
- 酒店
- 店铺
- 银行
- 学校
城市 3
- 房子
- 酒店
- 店铺
- 银行
- 学校

现在,我想做的是根据以下规则做一些操作:

如果检查了特定父节点下的任何子节点(例如 City1),则也会检查父节点状态。因此,我可以从文件中读取有关 City1 的信息,例如 file_index_1。由于找到了 file_index_1 ,因此是否检查来自同一父节点的另一个子节点无关紧要。我只需要至少检查一个子节点就可以检查父节点并使用相应的文件

如果选中 City2(或其任何子项),将调用 file_index_2

如果选中 CityN(或其任何子项),将调用 file_index_N

如果两个父节点都被勾选(因为每个父节点下至少勾选一个子节点),则只file_index_associated到被勾选子节点的父节点

如果例如 City1 没有被选中(因为没有在它下面选中子点头),file-index_1 将不会被使用。

如果所有父节点下都没有选中子节点,则不会调用任何文件。

在AfterCheck事件中,我可以用下面的代码获取被检查的父节点的索引:

Dim nodeIndex As Integer = 0

    For k As Integer = 0 To NumberOfParentNodes
        If e.Node.Text = "Specific Parentnode Name, eg. City1" Then
            nodeIndex = e.Node.Index  
            'call a file with the same index as the parentnode index
            'But How about if any childnode is checked even if the parentnode is not checked??
            'And how to get the index of the parent node of a child being checked
        End If
    Next

但是很难关联 child.checked => parent.checked。我希望我的意图是可以理解的。你能帮忙怎么做吗?

希望这将是您正在寻找的代码的良好起点:

Private Sub TreeViewBuilderButton_Click(sender As System.Object, e As System.EventArgs) Handles TreeViewBuilderButton.Click

    Dim nd As TreeNode = TestTreeView.Nodes.Add("C1", "City1")
    addChildren(nd)
    nd = TestTreeView.Nodes.Add("C2", "City2")
    addChildren(nd)
    nd = TestTreeView.Nodes.Add("C3", "City3")
    addChildren(nd)

    TestTreeView.ExpandAll()

End Sub

Private Sub addChildren(nd As TreeNode)

    nd.Nodes.Add(String.Concat(nd.Name, "_House"), "House")
    nd.Nodes.Add(String.Concat(nd.Name, "_Hotel"), "Hotel")
    nd.Nodes.Add(String.Concat(nd.Name, "_Shop"), "Shop")
    nd.Nodes.Add(String.Concat(nd.Name, "_Bank"), "Bank")
    nd.Nodes.Add(String.Concat(nd.Name, "_School"), "School")
End Sub

Private Sub TestTreeView_AfterCheck(sender As Object, e As System.Windows.Forms.TreeViewEventArgs) Handles TestTreeView.AfterCheck
    Try

        If (e.Action <> TreeViewAction.Unknown) Then
            Dim nd As TreeNode = DirectCast(e.Node, TreeNode)

            nd.Parent.Checked = anyChildChecked(nd.Parent)

            Debug.Print(String.Concat("Node: ", nd.Text, " Node Name: ", nd.Name, " Parent: ", nd.Parent.Text, " Parent Name:", nd.Parent.Name))
        End If

    Catch ex As Exception
        MessageBox.Show(String.Concat("An error occurred: ", ex.Message))
    End Try
End Sub

Private Function anyChildChecked(nd As TreeNode) As Boolean

    For Each ndChild As TreeNode In nd.Nodes
        If ndChild.Checked Then
            Return True
        End If
    Next

    Return False

End Function

例如,我检查了城市 2 酒店,然后检查了城市 1 银行 调试输出如下:

Node: Hotel Node Name: C2_Hotel Parent: City2 Parent Name:C2
Node: Bank Node Name: C1_Bank Parent: City1 Parent Name:C1

用上面相同的方法,我确实在文本控件中保存了父节点的 unckeck 值,这解决了问题