Implementierungsproblem

28/08/2009 - 11:31 von Karsten Sosna | Report spam
Hallo NG,
ich weiß noch nicht recht wie ich es beschreiben soll, aber das ganze soll
eigentlich so ablaufen wie bei bspw. einem TreeView. Dieses Control besitzt
eine Nodes-Auflistung. Füge ich jetzt dieser Nodes-Auflistung ein TreeNode
hinzu wird auch das TreeView aktualisiert. Gleiches geschieht, wenn ich
bspw. die Text-Eigenschaft eines Node àndere. Es scheint aber nun so, dass
nur der der betroffene Node ggf. neu gezeichnet wird und nicht das ganze
TreeView. Ich brauche irgendwie eine Möglichkeit eine Methode, die nur ein
Node aufrufen kann um den TreeView mitzuteilen, dass nur dieser Node
geàndert wurde. Z.B. so:
\\\
Dim TV As New TreeViewX
Dim ND As New TreeNodeX
TV.Nodes.Add(ND)
'Jetzt kommt eine Anderung
ND.Text = "Hello world"
'
Public Class TreeViewX : Inhreits List(Of TreeNodeX)
xxxx Sub DrawNode(node as TreeNodeX)
'Draw node
End Sub
End Class

Public Class TreeNodeX
Private _Text
Public Sub SetText(value As String) as String
_Text = value
'Hier müsste ich jetzt irgendwie TreeViewX.[DrawNode] aufrufen
können
End Sub
End Class
///
TreeViewX.[DrawNode] sollte aber nur von TreeNodeX aufgerufen werden können,
deswegen die "xxxx" vor der Sub.

Danke für jeden Tipp.
Gruß Scotty
 

Lesen sie die antworten

#1 Elmar Boye
28/08/2009 - 12:42 | Warnen spam
Hallo Karsten,

Karsten Sosna schrieb:
ich weiß noch nicht recht wie ich es beschreiben soll, aber das ganze soll
eigentlich so ablaufen wie bei bspw. einem TreeView. Dieses Control besitzt
eine Nodes-Auflistung. Füge ich jetzt dieser Nodes-Auflistung ein TreeNode
hinzu wird auch das TreeView aktualisiert. Gleiches geschieht, wenn ich
bspw. die Text-Eigenschaft eines Node àndere. Es scheint aber nun so, dass
nur der der betroffene Node ggf. neu gezeichnet wird und nicht das ganze
TreeView. Ich brauche irgendwie eine Möglichkeit eine Methode, die nur ein
Node aufrufen kann um den TreeView mitzuteilen, dass nur dieser Node
geàndert wurde. Z.B. so:
\\\
Dim TV As New TreeViewX
Dim ND As New TreeNodeX
TV.Nodes.Add(ND)
'Jetzt kommt eine Anderung
ND.Text = "Hello world"
'
Public Class TreeViewX : Inhreits List(Of TreeNodeX)



Da der Code ziemlich manuell aussieht:
Ist das jetzt wirklich so, d. h. direkt von List(Of T) abgeleitet?

Denn grundsàtzlich brauchst Du, nur das tun, was das TreeView (u. a.)
macht: Einen Verweis auf den Besitzer.

Ganz grob und ungetestet auf Basis einer Collection,
die Einsprünge für die Überwachung hat:

///
Public Class TreeViewX
Inherits System.Collections.ObjectModel.Collection(Of TreeNodeX)

Sub DrawNode(ByVal node As TreeNodeX)
'Draw node
End Sub

Protected Overrides Sub ClearItems()
For Each item As TreeNodeX In MyBase.Items
item.Owner = Nothing
Next
MyBase.ClearItems()
End Sub

Protected Overrides Sub InsertItem(ByVal index As Integer, ByVal item As TreeNodeX)
If item Is Nothing Then
Throw New ArgumentNullException("item")
End If

item.Owner = Me
MyBase.InsertItem(index, item)
End Sub

Protected Overrides Sub RemoveItem(ByVal index As Integer)
MyBase.Items(index).Owner = Nothing
MyBase.RemoveItem(index)
End Sub

Protected Overrides Sub SetItem(ByVal index As Integer, ByVal item As TreeNodeX)
MyBase.SetItem(index, item)
If item IsNot Nothing Then
item.Owner = Me
End If
End Sub
End Class

Public Class TreeNodeX
Private _owner As TreeViewX
Friend Property Owner() As TreeViewX
Get
Return Me._owner
End Get
Set(ByVal value As TreeViewX)
Me._owner = value
End Set
End Property

Private _Text As String
Public Property Text() As String
Get
Return _Text
End Get
Set(ByVal value As String)
_Text = value

If Me.Owner IsNot Nothing Then
Me.Owner.DrawNode(Me)
End If
End Set
End Property
End Class
\\\
Gruß Elmar

Ähnliche fragen