لدى على جهازى كتب كثيره جدا فقمت بأرشفتها داخل قاعدة بيانات حسب مجموعات و لكن المشكله كانت فى التنقل بين افرع الشجره فلابد منى ان اسحب الـ Scrollbar إلى اعلى و الى اسفل يمنة و يسارا فقط للوصول إلى عنصر فى الشجره فى حين انه يوجد فى المسار الذى اقف عليه فى هذا الوقت.
لذا فكرت فى صنع اداة LinkLabel تعرض المسار الخاص بالـ Node التى اقف عليها و تقوم بفصل تلك العناصر على اساس انى استطيع التنقل بين عناصر الشجره الموجوده فى المسار الحالى فقط بالضغط عليه داخل الـ LinkLabel و هو يقوم بتحديد هذا الفرع و تحريك الـ Scroll عليه.
و لكى لا اطيل عليكم هذه هى الاداه
<ToolboxBitmap(GetType(LinkLabel))> _
Public Class TreeViewLink
Inherits LinkLabel
Dim mTreeView As TreeView
Public Property TreeView() As TreeView
Get
Return mTreeView
End Get
Set(ByVal value As TreeView)
mTreeView = value
If value IsNot Nothing Then
AddHandler mTreeView.AfterSelect, AddressOf tvwAfterSelect
End If
End Set
End Property
Protected Overrides Sub OnLinkClicked(ByVal e As LinkLabelLinkClickedEventArgs)
MyBase.OnLinkClicked(e)
If mTreeView IsNot Nothing Then
Dim key As String = GetNodeKey(Me.Text, Me.Text.Substring(e.Link.Start, e.Link.Length))
mTreeView.SelectedNode = mTreeView.Nodes.Find(key, True)(0)
mTreeView.SelectedNode.EnsureVisible()
mTreeView.Focus()
End If
End Sub
Function GetNodeKey(ByVal path As String, ByVal Name As String) As String
Dim p() As String = path.Split(New String() {mTreeView.PathSeparator}, StringSplitOptions.RemoveEmptyEntries)
For w As Integer = 0 To p.Length - 1
If p(w) = Name Then
If w = p.Length - 1 Then Exit For
ReDim Preserve p(w)
Exit For
End If
Next
Dim nod As TreeNodeCollection = mTreeView.Nodes
For x As Integer = 0 To p.Length - 2
nod = InternalFind(p(x), nod)
Next
For i As Integer = 0 To nod.Count - 1
If nod(i).Text = Name Then
Return nod(i).Name
End If
Next
Return String.Empty
End Function
Function InternalFind(ByVal name As String, ByVal col As TreeNodeCollection) As TreeNodeCollection
For i As Integer = 0 To col.Count - 1
If col(i).Text = name Then
Return col(i).Nodes
End If
Next
Return col
End Function
Private Sub tvwAfterSelect(ByVal sender As Object, ByVal e As TreeViewEventArgs)
Dim path() As String = mTreeView.SelectedNode.FullPath.Split(New String() {mTreeView.PathSeparator}, StringSplitOptions.RemoveEmptyEntries)
Me.Links.Clear()
Me.Text = mTreeView.SelectedNode.FullPath
Dim start As Integer = 0
Dim ends As Integer = path(0).Length
For i As Integer = 0 To path.Length - 1
Me.Links.Add(start, ends)
start += path(i).Length + mTreeView.PathSeparator.Length
If i + 1 > path.Length - 1 Then Exit For
ends = path(i + 1).Length
Next
Erase path
End Sub
End Classلإستخدامها داخل برنامجك فقط قم بوضعها على الفورم ثم قم بتحديد اسم الـ TreeView من الخاصيه TreeView الموجوده بالأداه. و لكل Node داخل الشجره قم بوضع قيمه داخل الخاصيه Name لهذه الـ Node و يفضل ان لا يتكرر.
قمت بعمل مثال تطبيقى لهذه الاداه فقط قم بعمل Build للمشروع قبل ان تفتح الفورم حتى يتم عمل Build للاداه
هذه صوره للمثال
الكود فى المرفقات (الإصدار الأول)
الكود (الإصدار الثانى)
و الله ولى التوفيق
