Re: Treeview, sehr langsam



Peter Haus wrote:
....
ich fülle einen Treeview aus einem DataSet (Master = 14581
Datensätze, Child= 13808 Datensätze),
dabei setze ich für jeden Knoten die Text und Tag Eigenschaft.
Das Füllen des Treeviews dauert 58 sec auf einem 1.8 GHz Rechner. Das
beenden des Programmes
dauert auch nochmals 26 sec. Ist da etwas falsch, oder muss ich damit
leben?

Peter,
teste mal folgendes (bei mir nur 11 Sekunden). Wobei sich die Frage ergibt,
wer so viele Knoten zum Anschauen und Auswählen braucht. Allein das
Durchlesen aller Knoten in der ersten Ebene dauert bestimmt einige Stunden
(entsprechend dem Durchlesen von 243 Schreibmaschinenseiten):

Dim tv1 As TreeView
Dim dset As DataSet

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
tv1 = New TreeView
With tv1
.Dock = DockStyle.Fill
Me.Controls.Add(tv1)
End With
dset = LoadData()
Dim btn As New Button
With btn
.Dock = DockStyle.Top
.Text = "Load Tree"
AddHandler .Click, AddressOf btn_Click
Me.Controls.Add(btn)
End With
End Sub

Private Sub btn_Click(ByVal sender As Object, ByVal e As EventArgs)
With tv1
Dim t As Date = Now
.BeginUpdate()
BuildTree(.Nodes, dset)
.SelectedNode = .Nodes(0)
.EndUpdate()
Dim ts As TimeSpan = Now.Subtract(t)
MsgBox(ts.TotalSeconds.ToString)
End With
End Sub

' build TreeView
Private Sub BuildTree(ByVal nodes As TreeNodeCollection, ByVal dset As
DataSet)
For Each drow1 As DataRow In dset.Tables("Master").Rows
Dim tnod1 As New TreeNodeWithDataRow(drow1("NodeName").ToString,
drow1)
nodes.Add(tnod1)
For Each drow2 As DataRow In drow1.GetChildRows("relMasterChild")
tnod1.Nodes.Add(New TreeNodeWithDataRow(drow2("NodeName").ToString,
drow2))
Next drow2
Next drow1
End Sub

Private Class TreeNodeWithDataRow
Inherits TreeNode
Private _drow As DataRow
Public Sub New(ByVal text As String, ByVal drow As DataRow)
MyBase.New(text)
_drow = drow
End Sub
Public ReadOnly Property DataRow() As DataRow
Get
Return _drow
End Get
End Property
End Class

Private Function LoadData() As DataSet
Dim dset As New DataSet
Dim dtbl1 As New DataTable("Master")
dtbl1.Columns.Add(New DataColumn("ID", GetType(System.Int32)))
dtbl1.Columns(0).AutoIncrement = True
dtbl1.Columns(0).AutoIncrementSeed = -1
dtbl1.Columns(0).AutoIncrementStep = -1
dtbl1.Columns.Add(New DataColumn("NodeName", GetType(System.String)))
dset.Tables.Add(dtbl1)
Dim dtbl2 As New DataTable("Child")
dtbl2.Columns.Add(New DataColumn("ID", GetType(System.Int32)))
dtbl2.Columns(0).AutoIncrement = True
dtbl2.Columns(0).AutoIncrementSeed = -1
dtbl2.Columns(0).AutoIncrementStep = -1
dtbl2.Columns.Add(New DataColumn("FK", GetType(System.Int32)))
dtbl2.Columns.Add(New DataColumn("NodeName", GetType(System.String)))
dset.Tables.Add(dtbl2)
dset.Relations.Add(New DataRelation("relMasterChild", dtbl1.Columns(0),
dtbl2.Columns(1)))
For i As Integer = 1 To 14581
Dim drow1 As DataRow = dtbl1.NewRow
drow1!NodeName = "Row " & i.ToString
dtbl1.Rows.Add(drow1)
For k As Integer = 1 To 1
Dim drow2 As DataRow = dtbl2.NewRow
drow2!FK = drow1!ID
drow2!NodeName = "Row " & (i * 14581 + k).ToString
dtbl2.Rows.Add(drow2)
Next
Next
Return dset
End Function

Peter


.