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

时间:2015-07-07 12:33:23

标签: c# vb.net treeview treenode

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

City1
  - 房子
  - 酒店
  - 商店
  - 银行   - 学校 城2
  - 房子
  - 酒店
  - 商店
  - 银行   - 学校 请分享帮助
  - 房子
  - 酒店
  - 商店
  - 银行   - 学校

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

如果检查了特定父节点(例如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。我希望我的意图是可以理解的。你能帮忙怎么做吗?

2 个答案:

答案 0 :(得分:1)

希望这对于您正在寻找的代码来说是一个很好的起点:

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

例如,我检查了City 2 Hotel,然后检查了City1 Bank 调试输出如下:

  

节点:酒店节点名称:C2_Hotel父级:City2父级名称:C2
  节点:银行节点名称:C1_Bank父级:City1父级名称:C1

答案 1 :(得分:0)

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