2015-07-07 6 views
1

У меня есть TreeView с N номером родительских узлов, каждый из которых имеет равное количество дочерних узлов, например, следующий пример (City 1 , 2, ... являются родительскими узлами, а дочерние узлы - дом, гостиница, магазин, банк, школа);Как связать определенный родительский узел TreeView с конкретным файлом (vb.net/c#)

City1
- Дом
- Hotel
- Магазин
- Банк
- Школа
City2
- Дом
- Hotel
- Магазин
- Банк
- Школа
Город3
- Дом
- Hotel
- Магазин
- Банк
- Школа

Теперь, что я хотел бы сделать, это сделать некоторые операции, основываясь на следующих правилах:

если ребенок в возрасте до задается конкретный родительский узел, например City1), проверяется, также проверяется состояние родительского узла. Таким образом, я могу читать информацию о City1 из файла, скажем file_index_1. Поскольку file_index_1 находится, не имеет значения, проверен ли еще один дочерний узел из одного и того же родительского узла. Мне нужно только по крайней мере один дочерний узел проверяется, чтобы проверить родительский узел и использовать соответствующий файл

если City2 (или любой из его дочерних) проверяется, file_index_2 вызывается

если CityN (или любой из его дочерних), file_index_N вызывается

Если оба родительских узла отмечены флажком (поскольку для каждого родительского узла отмечен минимум один дочерний узел), то только родительский узел file_index_associated устанавливается в родительский узел, где проверяется дочерний узел.

если, например, City1 не проверен (поскольку ни один дочерний узел не проверен под ним), файл-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. Надеюсь, мои намерения понятны. Можете ли вы помочь, как это сделать?

ответ

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 отеля, а затем City1 Bank отладочный вывод выглядит следующим образом:

Node: Hotel Имя узла: C2_Hotel родитель: City2 родитель Имя: C2
Узел банка Имя узла: C1_Bank родитель: City1 родитель Имя: C1

+0

спасибо. Когда я сниму один из дочерних узлов, родительский узел не проверяется, даже если есть еще другие дочерние узлы. У меня такое же решение и проблемы в событии mouseClick с If e.Node.Checked = True Затем e.Node.Parent.Checked = True. У меня все еще вопрос о том, как сохранить родительский узел до тех пор, пока все дочерние узлы не будут отмечены? Поскольку это поможет мне контролировать, я все еще находится под одним и тем же родительским узлом, пока не выйду из него », когда все дочерние узлы не отмечены) – codelearner

+0

Я обновил код, чтобы отразить сценарий« любой проверенный ». –

0

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