PDA

View Full Version : مشکل در TreeView



Hossis
پنج شنبه 30 مهر 1388, 22:46 عصر
اگه در یک درختواره شاخه هائی داشته باشیم ،‌ چطور میشه تمام شاخه ها و زیر شاخه ها رو تشخیص داد یعنی یکی یکی متن اونها گرفت و در یک لیست قرار داد؟ اگه نمونه ای از این فرمول دیدید اینجا بذارید! به طور مثال ،‌TreeView دارای 100 شاخه و زیرشاخه و شاخه های فرعی است و ما می خواهیم همه آنها را با استفاده از یک حلقه For در بانک اطلاعاتی ذخیره کنیم ، باید چطور این کار را انجام دهیم؟


For I =0 to tv.GetNodeCount-1
???????
Next

pirmard
جمعه 01 آبان 1388, 00:11 صبح
اگه در یک درختواره شاخه هائی داشته باشیم ،‌ چطور میشه تمام شاخه ها و زیر شاخه ها رو تشخیص داد یعنی یکی یکی متن اونها گرفت و در یک لیست قرار داد؟ اگه نمونه ای از این فرمول دیدید اینجا بذارید! به طور مثال ،‌TreeView دارای 100 شاخه و زیرشاخه و شاخه های فرعی است و ما می خواهیم همه آنها را با استفاده از یک حلقه For در بانک اطلاعاتی ذخیره کنیم ، باید چطور این کار را انجام دهیم؟


For I =0 to tv.GetNodeCount-1
???????
Next



برای این کار چون شما می خاین فرزندان رو هم درنظر بگیرین باید از ساختار بازگشتی (ریکرسیو)استفاده کنید . یعنی به هر نود که می رسین اونو مانند یه درخت در نظر بگیرین و شوع به پیمایش فرزندان احتمالی اون بکنین .

کد زیر راهگشای شما خواهد بود :


Private Sub Trace_rec(ByVal Temp_TV As TreeView)
Dim Temp_TN As TreeNode
For Each Temp_TN In Temp_TV.Nodes
Trace_Child(Temp_TN)
Next
End Sub

Private Sub Trace_Child(ByVal Temp_TN As TreeNode)
Debug.WriteLine(Temp_TN.Text)
Dim Temp_Node As TreeNode
For Each Temp_Node In Temp_TN.Nodes
Trace_Child(Temp_Node)
Next
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Trace_rec(TreeView1)
End Sub

rooshan2008
جمعه 01 آبان 1388, 00:16 صبح
سلام
به وسیله یک تابع بازگشتی می تونیم خیلی راحت این کارو انجام بدیم با تغییر مختصر این الگوریتم می تونیم جستجوی فایل و پوشه های را در هر زیر شاخه ای انجام بدیم.
تعایف

Dim listStr As New List(Of String)




Public Sub Node(ByVal Tv As TreeNodeCollection)
Dim B As TreeNode
For Each B In Tv
listStr.Add(B.FullPath)
If B.Nodes.Count > 0 Then

Node(B.Nodes)
End If

Next

End Sub



نحوه فراخونی


Node(TreeView1.Nodes)


نتیجه در لیست listStr قرار داره حالا شما می تونید با یک Forهمه اجازای این آرایه رو نشون بدین.





For Each s In listStr
ListBox1.Items.Add(s)
Next

Hossis
یک شنبه 03 آبان 1388, 07:35 صبح
برای این کار چون شما می خاین فرزندان رو هم درنظر بگیرین باید از ساختار بازگشتی (ریکرسیو)استفاده کنید . یعنی به هر نود که می رسین اونو مانند یه درخت در نظر بگیرین و شوع به پیمایش فرزندان احتمالی اون بکنین .

عالی بود ممنون
یک مسئله دیگر هم هست و اون اینه ک اگر بخواهیم با توجه به شماره نود،‌مستقیم به به آن دسترسی داشته باشیم و این عضو فرزند فرزند ... باشد ( در شاخه دوم به پایین باشد) چطور این کار را انجام دهیم
مثلا نود شماره 20 که در این مسیر است
ریشه » شاخه اول » شاخه دوم » شاخه سوم.
کد زیر فقط اونهایی که در ریشه هستندنشون میده اما زیر مجموعه هارو برنمیگردونه


dim Nod as treeNode
nod=tv.nodes(20)

کد زیر هم فقط با نام شاخه کار می کند نه با شماره آن


Nod=tv.Nodes.find("Node20",true)(0)

من کدی نظیر همین آخری می خوام که به جای وارد کردن نام "Key" مربوط به یک نود، بتوان شماره آن عضو را وارد کرد.

Hossis
یک شنبه 03 آبان 1388, 07:59 صبح
سلام
به وسیله یک تابع بازگشتی می تونیم خیلی راحت این کارو انجام بدیم با تغییر مختصر این الگوریتم می تونیم جستجوی فایل و پوشه های را در هر زیر شاخه ای انجام بدیم.
تعایف

Dim listStr As New List(OfString)




PublicSub Node(ByVal Tv As TreeNodeCollection)
Dim B As TreeNode
For Each B In Tv
listStr.Add(B.FullPath)
If B.Nodes.Count > 0 Then
Node(B.Nodes)
EndIf
Next
EndSub



نحوه فراخونی


Node(TreeView1.Nodes)

این الگوریتم جواب نداد

tabatabaeefar
یک شنبه 03 آبان 1388, 12:00 عصر
سلام
به نظرم تمامي دوستاني كه در زمينه TreeView سئوال دارند اگه يه سري به برنامه اي كه توي اين تاپيك گذاشتم بزنند، يا جوابش اونجا هست يا با يه خورده تغيير به راحتي ميتونن به جواب برسن.
http://barnamenevis.org/showthread.php?t=156060
موفق باشيد.

pirmard
یک شنبه 03 آبان 1388, 12:13 عصر
عالی بود ممنون
یک مسئله دیگر هم هست و اون اینه ک اگر بخواهیم با توجه به شماره نود،‌مستقیم به به آن دسترسی داشته باشیم و این عضو فرزند فرزند ... باشد ( در شاخه دوم به پایین باشد) چطور این کار را انجام دهیم
مثلا نود شماره 20 که در این مسیر است
ریشه » شاخه اول » شاخه دوم » شاخه سوم.


منظورتون اینجا از شماره همون ایندکس هست ؟ من از مثالی که زدید و اینکه گفتید در شاخه دوم به پایین در دسترس نیست برداشتم اینه که شما منظورتون همون index هر نود بوده .
اما این ایندکس رو نمیشه به این صورت که شما می خاین استفاده کرد . چون در هر گره، ایندکس گذاری فرزندان از صفر شروع میشه. یعنی اولین نود فرزند هر گره خودبخود ایندکسش صفر ه. پس ایندکس، مشخصه ی یکتایی نیست برای گره های کل یک درخت .

arsalansalar
یک شنبه 03 آبان 1388, 13:13 عصر
اين لينك و ببين

http://barnamenevis.org/forum/showthread.php?t=154637

Hossis
سه شنبه 05 آبان 1388, 10:10 صبح
منظورتون اینجا از شماره همون ایندکس هست ؟ من از مثالی که زدید و اینکه گفتید در شاخه دوم به پایین در دسترس نیست برداشتم اینه که شما منظورتون همون index هر نود بوده .
اما این ایندکس رو نمیشه به این صورت که شما می خاین استفاده کرد . چون در هر گره، ایندکس گذاری فرزندان از صفر شروع میشه. یعنی اولین نود فرزند هر گره خودبخود ایندکسش صفر ه. پس ایندکس، مشخصه ی یکتایی نیست برای گره های کل یک درخت .
منظورم یک چیزی تو همین چیزهاست چرا که در وی بی 6،‌ هریک از نودها ایندکس مخصوص به خود داشتند و مشکلی ایجاد نمی شد اما با این بیان شما ، دسترسی به زیر مجموعه ها با مشکل مواجه می شود
البته یک فرق کوچک در سؤال من هست و اون اینه که :‌ ما کار به ایندکس نداریم، فرض کنید هنگامی که اعضای درخت بار می شوند،‌ به ترتیب به درخت افزوده می شوند، حال می خواهیم عضو و نودی که در رتبه 58 ( از بین 100 نود ) بوده رو با استفاده از همین شماره 58 فراخوانی کنیم،‌حال با توجه به این که از راه ایندکس نمی شود دسترسی داشت،‌آیا راه دیگری برای این کار وجود ندارد؟

pirmard
پنج شنبه 07 آبان 1388, 14:57 عصر
ما کار به ایندکس نداریم، فرض کنید هنگامی که اعضای درخت بار می شوند،‌ به ترتیب به درخت افزوده می شوند، حال می خواهیم عضو و نودی که در رتبه 58 ( از بین 100 نود ) بوده رو با استفاده از همین شماره 58 فراخوانی کنیم،‌حال با توجه به این که از راه ایندکس نمی شود دسترسی داشت،‌آیا راه دیگری برای این کار وجود ندارد؟

البته روشتون زیاد درست نیست. یعنی مبنای دسترسیتون در واقع بر پایه ی زمان اضافه شده گره به نود داره نوشته میشه که خوب مسلما کارآمد نیست و اگر در زمان اجرا گره ای از وسط حذف بشه و یا اضافه بشه مشکل بیشتر میشه . مثلا گره ای با شماره ی 100 در روت قرار بگیره

اما برای کار شما فکر می کنم استفاده از key بتونه کمکتون کنه . که در زمان اضافه کردن گره ها (چه در حلقه و یا از دیتابیس) و چه به صورت تک تک key به اونها اختصاص بدین به ترتیب

TreeView1.Nodes.Add(0, "0")
TreeView1.Nodes.Add(1, "1")
TreeView1.Nodes(1).Nodes.Add(2, "1-0")
TreeView1.Nodes(0).Nodes.Add(3, "0-0")
Dim node As TreeNode = TreeView1.Nodes.Find(2, True)(0)
Me.Text = node.Text

Hossis
پنج شنبه 07 آبان 1388, 16:26 عصر
باز هم ممنون ازجوابتون
این خاصیت key باید رشته ای باشد و عدد قبول نمی کند.
با بیان شما من به یک نکته دیگه پی بردم و اون اینه که خاصیت tag هر نود را به یک شماره اختصاص بدم یا همین خاصیت "key" منتها باید برای دسترسی به هر نود ، تمام اعضای درخت را بررسی کرد.

pirmard
پنج شنبه 07 آبان 1388, 17:35 عصر
باز هم ممنون ازجوابتون
این خاصیت key باید رشته ای باشد و عدد قبول نمی کند.


بله . چون من این کدو در حالت Option Strict Off تست می کردم به خودم اجازه دادم که عدد رو به جای استرینگ قرار بدم .

ROSTAM2
دوشنبه 20 آذر 1402, 21:13 عصر
سلام به همه.
برای سوال اصلی این تاپیک یکی از روش هایی که وجود داره شاید روش مناسبتری هم باشه ذخیره شاخه ها با زیرشاخه هایشان بصورت XML هست که برای فراخوانی شاحه ها و زیرشاخه ها هم گزینه مناسبی اشت.