Befüllen eines TreeViews

19/10/2008 - 07:47 von Uwe Ricken | Report spam
Guten Morgen zusammen,

ich habe ein Problem, ein TreeView mit .NET schnell und effizient zu füllen.
Folgende Techniken liegen meinem Versuch zu Grunde:

Ich habe eine View auf dem SQL-Server, die die komplette Struktur des
Treeviews abbildet.
Dazu gehören u. a. die folgenden Attribute und Werte:

ndRelation | ndRelationship | ndKey | ndText | ...
NULL | NULL | A | TopNode
A | 4 | A1 | A.1. Erste Ebene
A1 | 4 | A11 | Zweite Ebene

Diese Struktur hat sich schon seit vielen Jahren in VB(A) bewàhrt und
funktioniert dort auch zur vollsten Zufriedenheit.
Ich öffne nun mittels SQLDataReader die Tabelle um sie zu durchlaufen und
dabei das Treeview zu füllen.

Zum Befüllen verwende ich folgenden .NET - Code

Public Sub Fill()
Dim ParentNode As TreeNode
ParentNode = Nothing

If axTV Is Nothing Then
Exit Sub
End If

With axTV
If Clear = True Then
.Nodes.Clear()
End If

While sqlds.Read
axND = New TreeNode

With axND
.Name = sqlds!ndKey
.Tag = sqlds!ndTag
.Text = sqlds!ndText
End With

If sqlds!ndRelative.Equals(System.DBNull.Value) = False Then
ParentNode = axTV.Nodes(sqlds!ndRelative)
End If

If Not ParentNode Is Nothing Then
ParentNode.Nodes.Add(axND)
Else
axTV.Nodes.Add(axND)
End If

ParentNode = Nothing
End While
End With
End Sub

Das Problem: Bis zum zweiten Level werden die Knoten sauber verarbeitet.
Leider jedoch wird die Zeile [ParentNode = axTV.Nodes([Name]) nicht so
verwendet, wie ich es mir gedacht hatte.
Sobald sich der Knoten in der zweiten Hierarchie befindet, wird er nicht
mehr sauber aufgelöst.

Gibt es eventuell eine andere Möglichkeit, einen Knoten eindeutig zu
identifizieren?
Herzlichen Dank für Eure Unterstützung



Gruß, Uwe Ricken
MCP for SQL Server 2000 Database Implementation

db-Berater GmbH - 64390 Erzhausen
http://www.db-berater.de
http://www.memberadmin.de
http://www.conferenceadmin.de
____________________________________________________
dbdev: http://www.dbdev.org
FAQ: http://www.donkarl.com/AccessFAQ.htm
 

Lesen sie die antworten

#1 Karsten Sosna
19/10/2008 - 11:14 | Warnen spam
Public Sub Fill()
Dim ParentNode As TreeNode
ParentNode = Nothing

If axTV Is Nothing Then
Exit Sub
End If

With axTV
If Clear = True Then
.Nodes.Clear()
End If

While sqlds.Read
axND = New TreeNode

With axND
.Name = sqlds!ndKey
.Tag = sqlds!ndTag
.Text = sqlds!ndText
End With

If sqlds!ndRelative.Equals(System.DBNull.Value) = False
Then
ParentNode = axTV.Nodes(sqlds!ndRelative)
End If

If Not ParentNode Is Nothing Then
ParentNode.Nodes.Add(axND)
Else
axTV.Nodes.Add(axND)
End If

ParentNode = Nothing
End While
End With
End Sub

Das Problem: Bis zum zweiten Level werden die Knoten sauber verarbeitet.
Leider jedoch wird die Zeile [ParentNode = axTV.Nodes([Name]) nicht so
verwendet, wie ich es mir gedacht hatte.



Hallo Uwe,
ist irgendwie logisch. Ich nehme mal an axTV ist Dein TreeView. Dan schau
mal:
\\\
Dim axTV As New TreeView
Dim TN1 As New TreeNode("TreeNode1")
TN1.Name = "TreeNode1"
axTV.Nodes.Add(TN1)
Dim TN2 As New TreeNode("TreeNode2")
TN2.Name = "TreeNode2"
TN1.Nodes.Add(TN2)
Console.WriteLine(axTV.Nodes.ContainsKey("TreeNode1"))
Console.WriteLine(axTV.Nodes.ContainsKey("TreeNode2"))
Console.WriteLine(axTV.Nodes("TreeNode1").Nodes.ContainsKey("TreeNode2"))
///
Ausgabe:
True
False
True

Nicht das TreeView beinhaltet den Schlüssel sondern die Nodes-Auflistungen.
Jetzt schau Dir mal Deinen Code an. Du versuchst immer einen Knoten aus dem
TreeView zu holen(ParentNode = axTV.Nodes(sqlds!ndRelative) ). Das kann
nicht funktionieren. Du müsstes also die Nodes-Auflistungen rekursiv
durchsuchen um den richtigen Knoten(oder uberhaupt einen) zu finden. Also
ungefàhr so:
\\\
Console.WriteLine(FindNode(axTV.Nodes, "TreeNode2").ToString)
'...
Private Function FindNode(ByVal nodes As TreeNodeCollection, ByVal key As
String) As TreeNode
If nodes.ContainsKey(key) Then
Return nodes(key)
Else
For Each node As TreeNode In nodes
Dim ret As TreeNode = FindNode(node.Nodes, key)
If ret IsNot Nothing Then
Return ret
End If
Next
End If
Return Nothing
End Function
///
Für Dein Beispiel also:
ParentNode = FindNode(axTV.Nodes, sqlds!ndRelative)
Gruß Scotty

Ähnliche fragen