我有一个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。我希望我的意图是可以理解的。你能帮忙怎么做吗?
答案 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值,这解决了问题