PDA

View Full Version : کمک برای TreeView جدید در .net



Amin_tus
شنبه 03 آبان 1382, 01:43 صبح
سلام....

من نمیدونم که چرا Treeview دات نت چرا اینقدر بدرد نخور شده!

ما در Treeview قدیمی خودمان در ویژوال بیسک 6 میتوانستیم با دادن یک شماره Parent مستقیماً به شاخه مورد نظر خود برسیم ولیکن ظاهراً این مکانیزم در دات نت به کل کنار گذاشته شده و تنها بروش تعریف شی میتوان اینکار را انجام داد....

حالا من چطور میتوانم بدون اینکه از تعداد شاخه ها با خبر باشم و بدانم تا چقدر برنامه من میخواهد داخل هر شاخه و سطح شود فقط با دادن موقعیت یک شاخه آن را یافته و یک مورد را به آن اضافه کنم؟

S.Azish
دوشنبه 05 آبان 1382, 16:59 عصر
میشه از یک تابع استفاده کرد تا اون Node خاص رو پیدا کرد و بهش اضافه کرد




Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'
Dim tn As TreeNode

With TreeView1
tn = .Nodes.Add("Main 1")
tn.Nodes.Add("Child 1-1")
tn.Nodes.Add("Child 1-2")
tn.Nodes.Add("Child 1-3")
tn = .Nodes.Add("Main 2")
tn.Nodes.Add("Child 2-1")
tn.Nodes.Add("Child 2-2")
tn.Nodes.Add("Child 2-3")
End With

AddToNode(6, TreeView1, New TreeNode("New node"))
'
End Sub

Private Sub AddToNode(ByVal index As Integer, ByRef treeView As TreeView, ByRef node As TreeNode)
'
Dim tnTemp As TreeNode = GetNode(TreeView1.Nodes, index, 0)

If Not tnTemp Is Nothing Then
tnTemp.Nodes.Add(node)
End If
'
End Sub

Private Function GetNode(ByRef nodes As TreeNodeCollection, ByVal index As Integer, _
ByRef currentIndex As Integer) As TreeNode
'
Dim tnTemp As TreeNode

For Each tnTemp In nodes
currentIndex += 1
If currentIndex = index Then
Exit For
End If
If tnTemp.GetNodeCount(False) > 0 Then
tnTemp = GetNode(tnTemp.Nodes, index, currentIndex)
End If
Next

Return tnTemp
'
End Function

Amin_tus
چهارشنبه 07 آبان 1382, 01:11 صبح
با ارسال این سوال فکر نمیکردم جوابی دریافت کنم .... ولی با دریافت جواب حرفه ای واقعاً شگفت زده شدم...
ولی ظاهراً نتوانستم منظور خود را بخوبی بیان کنم..... دلیلش این است که بیان آن کمی فراتر از ده ها خط طول میکشید.... ولی اینبار با نمودار و مجهز آمده ام تا بلکه کسی پیدا شود و مرا از این سر درگمی نجات دهد....
همانطور که میدانید ما از Treeview بیشتر برای نمایش فایلها و فولدرهای موجود در سیستم استفاده میکنیم... در کنترل Treeview قدیمی ما میتوانستیم با دادن تنها عدد والد (ParentNumber) فولدر مربوطه را به Treeview اضافه کنیم... در Treeview دات نت به دلیل گرایش به سمت شی گرایی این کار بسیار مشکل تر شده است و مجهولات زیادی را بر سر راه من قرار داده است...
در برخی فایلها ما برای یافتن فولدر ها از primary volume Descriptor یا همان PVD استفاده میکنیم. با خواندن این جدول ما میتوانیم تنها به یک عدد parrent number و نام فولدر دسترسی داشته باشیم و قادر به دریافت اطلاعات بیشتر جهت یافتن موقعیت فولدر نیستیم... حالا من یک parrent number و نام فولدر در دست دارم که به ترتیب طبق دیاگرام B به من ارسال میشودو من باید آنها را در Treeview قرار دهم...و همانطوری که در دیاگرام A ملاحظه میکنید هر فولدر که نامهای تصادفی برای آنها گذاشته ام ! با شماره parrentNumber خود به پوشه والد خود اشاره میکند. مثلاً فولدری به نام Level 0 دارای parent nubmer ای به نام 5 میباشد که به معنی وجود این فولدر در فولدر شماره 5 است ( به نام First ) و الی آخر...
حالا طبق دیاگرام B در اولین خواندن جدول PVD به من Root با Parrent صفر ارسال میشود که باید آن را در Treeview اضافه کنم و بعد File 0 با شماره والد 1 و ....
مسلماً در نهایت باید من بتوانم پس از خواندن جدول PVD شمایی مانند دیاگرام C در Treeview داشته باشم....
در ویژوال بیسیک 6 میتوانستم با هر بار خواندن ParentNumber و نام فولدر از دستور زیر جهت یافتن موقعیت درست فولدر در Treeview استفاده کنم:
( TreeView.Nodes.Add(ParentNum, 4, , DirName, 1
ولی با عوض شدن متدهای قابل قبول در دات نت چنین چیزی دیگر امکان ندارد ....
من از آن روالهای بالا که مدیر ارسال کرده اند تشکر میکنم ولی زیاد از آنها سر در نیاوردم اگر میتوانند کمی توضیح دهند و شرح دهند که برای چه کاری استفاده میشودو پارامترهای ADDNode و GetNode چگونه تنظیم میشوند و آیا قادر به انجام چنین کاری میباشند و ...

Amin_tus
چهارشنبه 07 آبان 1382, 01:13 صبح
دیاگرام

Amin_tus
چهارشنبه 07 آبان 1382, 02:31 صبح
آقا متاسفانه سایت میگه که :
مشکل در Upload کردن: امکان Upload به ./files/diagram.zip وجود ندارد.

برای همین نمیتونم دیاگرامهایی که توضیح دادم ضمیمه کنم نمیدونم مشکل از کجاست ولی اینم یه جور مصیبت شده دیگه ....

"مشکل در Upload کردن: امکان Upload به ./files/diagram.zip وجود ندارد."

کسی علت این پیغام رو میدونه؟

S.Azish
چهارشنبه 07 آبان 1382, 14:00 عصر
با اینکه خیلی خوب توضیح دادید ولی من متوجه نشدم ولی مشکل رو به این شکل حل کردم




Imports System.IO

Public Class Form1
Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

Public Sub New()
MyBase.New()

'This call is required by the Windows Form Designer.
InitializeComponent()

'Add any initialization after the InitializeComponent() call

End Sub

'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer

'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents _foldersTV As System.Windows.Forms.TreeView
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me._foldersTV = New System.Windows.Forms.TreeView
Me.SuspendLayout()
'
'_foldersTV
'
Me._foldersTV.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me._foldersTV.ImageIndex = -1
Me._foldersTV.Location = New System.Drawing.Point(13, 10)
Me._foldersTV.Name = "_foldersTV"
Me._foldersTV.SelectedImageIndex = -1
Me._foldersTV.Size = New System.Drawing.Size(458, 267)
Me._foldersTV.TabIndex = 0
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(503, 292)
Me.Controls.Add(Me._foldersTV)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)

End Sub

#End Region

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'
AddToFolder(_foldersTV.Nodes, "C:\")
'
End Sub

Private Sub AddToFolder(ByVal nodes As TreeNodeCollection, ByVal folder As String)
'

If nodes.Count = 0 Then
Dim tnFolder As TreeNode = nodes.Add(GetMemberName(folder))

tnFolder.Tag = folder
nodes = tnFolder.Nodes
End If

Dim subFolders() As String = Directory.GetDirectories(folder)
nodes.Clear()
'Sub Folders
If subFolders.Length > 0 Then
For i As Integer = 0 To subFolders.Length - 1
Dim tn As TreeNode = nodes.Add(GetMemberName(subFolders(i)))
tn.Tag = subFolders(i)

Dim nestedSubFolders() As String = Directory.GetDirectories(subFolders(i))
If nestedSubFolders.Length > 0 Then
tn.Nodes.Add(GetMemberName(nestedSubFolders(0)))
End If
Next
End If

'Files
Dim files() As String = Directory.GetFiles(folder)
If files.Length > 0 Then
For i As Integer = 0 To files.Length - 1
Dim tn As TreeNode = nodes.Add(GetMemberName(files(i)))
tn.Tag = files(i)
Next
End If
'
End Sub

Private Function GetMemberName(ByVal fullName As String) As String
'
Dim members() As String = fullName.Split("\"c)

If Not members(members.Length - 1).Trim.Length = 0 Then
Return members(members.Length - 1)
Else
Return fullName
End If
'
End Function

Private Sub _foldersTV_AfterExpand(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles _foldersTV.AfterExpand
'
If e.Node.GetNodeCount(False) > 1 Then Exit Sub
AddToFolder(e.Node.Nodes, e.Node.Tag.ToString)
'
End Sub
End Class

Amin_tus
جمعه 09 آبان 1382, 01:16 صبح
دست شما درد نکند که اینقدر زحمت میکشید و این جوابهای جالب را ارسال میکنید...

از این جوابهای به نظر میرسد که در دات نت بسیار حرفه ای و با تجربه هستید...

و لی جواب شما باز هم با آن چیزی که من گفتم متفاوت بود... علت این است که دیاگرام ها ارسال نشد... بنابراین توضیحات من بی فایده بود......

اکنون دیاگرام ها را ارسال کردم ... اگر لطف کنید یک نگاهی به آنها هم بیاندازید... تا شاید منظور مرا متوجه شوید....

S.Azish
جمعه 09 آبان 1382, 13:55 عصر
برای اینکار من یک کلاس درست کردم که یک تابع داره به نام AddToParent که ParentNumber و Text آیتم جدید رو براش میفرستید. فقط کافیه یک instance از این کلاس بسازید و Treeview خودتون رو توی constructor براش بفرستید.

کلاس TreeviewController


Option Strict On
Option Explicit On

Public Class TreeViewController
Private _tv As TreeView
Private _counter As Integer

Public Sub New(ByRef treeView As TreeView)
_tv = treeView
End Sub

Public Function AddToParent(ByVal ParentNumber As Integer, ByVal text As String) As TreeNode
'
_counter += 1
If ParentNumber = 0 Then
Return AddNode(_tv.Nodes, text)
Exit Function
End If

Dim tnTemp As TreeNode = GetParentNode(_tv.Nodes, ParentNumber)
If Not tnTemp Is Nothing Then
Return AddNode(tnTemp.Nodes, text)
End If
'
End Function

Private Function GetParentNode(ByRef nodes As TreeNodeCollection, ByVal index As Integer) As TreeNode
'
Dim tnParent As TreeNode

For Each tnTemp As TreeNode In nodes
If Not tnTemp.Tag Is Nothing AndAlso CType(tnTemp.Tag, Integer) = index Then
tnParent = tnTemp
Exit For
End If
If tnTemp.GetNodeCount(False) > 0 Then
tnParent = GetParentNode(tnTemp.Nodes, index)
End If
Next

Return tnParent
'
End Function

Private Function AddNode(ByRef nodes As TreeNodeCollection, ByVal text As String) As TreeNode
'
Dim tn As New TreeNode(text)

tn.Tag = _counter
nodes.Add(tn)

Return tn
'
End Function

End Class



بعد آیتم ها رو اضافه کنید


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'
Dim tvc As New TreeViewController(TreeView1)

tvc.AddToParent(0, "Root") '1
tvc.AddToParent(1, "File 0") '2
tvc.AddToParent(1, "Other 0") '3
tvc.AddToParent(2, "File 1") '4
tvc.AddToParent(3, "First") '5
tvc.AddToParent(3, "Second") '6
tvc.AddToParent(3, "Third") '7
tvc.AddToParent(5, "Level 0") '8
tvc.AddToParent(8, "Level 1") '9
'
End Sub

Amin_tus
دوشنبه 12 آبان 1382, 01:26 صبح
واقعاً دست شما درد نکند......

شما Treeview دات نت را کاملاً ترمیم کردید با این کلاس اکنون یک Treeview دوست داشتنی به من هدیه دادید....


کمک شما را هیچگاه فراموش نمیکنم...................................... .......................

امیدوارم همیشه موفق و پاینده باشید....!