PDA

View Full Version : جستجو در tree view (تبدیل کدها از vb.net به Vb)



ali190
چهارشنبه 10 شهریور 1389, 12:26 عصر
باسلام و عرض خسته نباشید
من میخواستم در tree view ای که میخوام ازش در پروژ ام استفاده کنم قابلیت سرچ رو اضافه کنم
متاسفانه یا خوشبختانه کثرت مثالها در اینترنت و جاهای دیگه بیشتر در مورد vb.net هست
مشکلم رو در اینجا مطرح کردم:
http://barnamenevis.org/forum/showthread.php?t=243454
یک سری تابع و نمونه کد هم از اینترنت پیدا کردم ، فقط میخواستم ازتون خواهش کنم که این کدها رو برام در یک پروژه vb یا همون نمونه فایلی (http://barnamenevis.org/forum/attachment.php?attachmentid=55127&d=1283267083)که در لینک بالا قرار دادم اجرایی کنید تا من بتونم از اون در پروژه ام استفاده کنم.
این هم نمونه کدها:
http://www.daniweb.com/forums/thread164233.html
ممنون میشم اگر کمکم کنید.
یاعلی

Saman_12
چهارشنبه 10 شهریور 1389, 15:09 عصر
سلام.
شاید این کدی که براتون میزارم خیلی ساده باشه اما توی کل Tree View سرچ می کنه و اگه پیدا کرد مسیر کامل رو بر می گردونه :


Dim i As Integer
For i = 1 To TV1.Nodes.Count - 1

If TV1.Nodes.Item(i).Text = Text1.Text Then

MsgBox TV1.Nodes.Item(i).FullPath
End If

Next

این کد توی 6 کار می کنه توی دات نت رو نمی دونم.

برای این که برای حروف بزگ کوچیک هم تفاوت قائل نشه کد رو این جوری تغییر بده :


Dim i As Integer
For i = 1 To TV1.Nodes.Count - 1

If UCase$(TV1.Nodes.Item(i).Text) = UCase$(Text1.Text) Then

MsgBox TV1.Nodes.Item(i).FullPath
End If

Next

nasim bahari
چهارشنبه 10 شهریور 1389, 15:37 عصر
سلام.....دوست عزیز

در این تایپیک یه کامبو باکس واسه Down گذاشتم که وقتی باز می شه یه تری ویو در اختیار شما می زاره در ضمن نود انتخابی رو هم بر می گردونه که شما می تونی طوری کد رو تغییر بدی که اون نودی رو که شما می خواین انتخاب کنه و برگردونه....فقط کافیه یه کم کد رو تغییر بدی...

http://www.barnamenevis.org/forum/showthread.php?t=241825&highlight=%DA%A9%D8%A7%D9%85%D8%A8%D9%88+%D8%A8%D8 %A7%DA%A9%D8%B3


موفق باشی

ali190
چهارشنبه 10 شهریور 1389, 15:56 عصر
باسلام
ممنون سامان عزیز
دوتاسئوال
1) آیا میشه سیستم سرچ رو جوری تنظیم کرد که بعد از سرچ دقیقاً node یافت شده روش select بشه؟ و اگر تعداد موارد یافت شده بیشتر از یک مورد باشه عین سیستم سرچ word یا اکسل بتوان با دکمه find next به گزینه بعدی برهو اون رو سلکت کنه؟
2) فایل ضمیمه رو دانلود کنه.
یک سری دکمه گذاشتم تا با کمک این دکمه بتونم سطوح مختلف tree view رو باز کنم
روی دکمه "سطح0" کلیک کن
روی دکمه "سطح1" کلیک کن
روی دکمه "سطح2" کلیک کن ، دقیقاً مشکلم از همینجا شروع میشه با زدن این دکمه فقط در مورد اولین مسیر این شاخه اجرا میشه نه در شاخه های دیگر
من میخوام دستورات گشایش سطوح در تمام گره ها اجرا بشه
ممنون میشم کمکم کنید

hero4000
پنج شنبه 11 شهریور 1389, 08:34 صبح
دوست عزيز اون کدي که دوستمون سامان جان گذاشتند فکر مي کنم فقط شاخه اصلي درخت رو جستجو ميکنه

شما ببين اول که همين رو ميخواي بعد گسترشش بده

ali190
پنج شنبه 11 شهریور 1389, 09:52 صبح
باسلام

دوست عزيز اون کدي که دوستمون سامان جان گذاشتند فکر مي کنم فقط شاخه اصلي درخت رو جستجو ميکنه

شما ببين اول که همين رو ميخواي بعد گسترشش بده
من هم همین کدها مد نظرم هست
دلم هم میخواد گسترشش بدم ولی نمیشه
من میخوام همین مکانیزم در تمام شاخه ها اجرا بشه و توسط این کد اگر حتی دوکلمه یکسان در دوشاخه متفاوت وجو د داشت روش سلکت انجام بشه ،
مثلاً:
فرض کنید در یک نمودار شاخه درخت من از کلمهABC چهار تا دارم
عملیات سرچ انجام میشه اولین ABC پیدا میشه بعد

http://barnamenevis.org/forum/attachment.php?attachmentid=55215&stc=1&d=1283410206
فقط قبلش باید یه حلقه تعریف بشه که این عملیات جستجو در تمام شاخه ها انجام بشه.

کد:
For Each node In tv1.nodes
ممنون میشم کمکم کنید

Saman_12
پنج شنبه 11 شهریور 1389, 10:13 صبح
Hero جان این کد برای 6 هست درسته که برای دات نت هم کار می کنه اما به قول شما فقط شاخه ی اصلی رو جستجو می کنه اما توی 6 همه شاخه ها رو اگه 6 نصب داری امتحان کن ضرر ندادره.!:قهقهه:

برای Select شدنش من راه ندارم (چون با این ابزار زیاد کار نکردم.) اما برای اون قسمتی که گفتی بیش از 1 مورد یافت شد کد دفعه قبل رو به این کد تغییر بده :


Dim i, n, s As Integer
Dim Boo As Boolean
Boo = False
n = GetSetting("Tree View", "Setting", "I", 0)

For i = n + 1 To TV1.Nodes.Count

If UCase$(TV1.Nodes.Item(i).Text) = UCase$(text1.Text) And Boo = False Then
Boo = True

TV1.Nodes.Item(i).Parent.Expanded = True
TV1.Nodes.Item(i).Bold = True

If i <> TV1.Nodes.Count Then

Timer.Enabled = True
SaveSetting "Tree View", "Setting", "I", i
Else

MsgBox "Finished Find Text", vbInformation

DeleteSetting "Tree View", "Setting"
End If

End If
Next

Boo = False

حالا یه تایمر با اینتر وال 500 به بالا بزار روی فرم و Enable ش رو False کن این کد رو هم توی تایمر بنویس :


Dim i As Integer
i = GetSetting("Tree View", "Setting", "I", 0)

TV1.Nodes.Item(i).Bold = False
Timer.Enabled = False

البته تایمر رو هم نزاشاتی فرقی نمی کنه فقط برای همون شبیه سازی Select هستش.:لبخند:

ali190
پنج شنبه 11 شهریور 1389, 13:32 عصر
سامان جان
این کدی که لطف کردی و اینجا قرار داد حتی مواردی رو هم که در داخل tree view وجود دارد رو هم پیغام میده که "not found "
مثلاً کلمه "cat" رو سرچ کن.
ممنون

hero4000
شنبه 13 شهریور 1389, 11:41 صبح
دوست عزيز براي اينکار دو روش وجود دارد

1- شما بايد ابتدا شاخه اصلي رو با يک حلقه مرور کني بعد در هر بار تکرار حلقه وجود زير شاخه توي شاخه اصلي رو چک کني و اگه موردي که سرچ ميکني توي اين درخت بود که پيغام لازم رو ميده و اگه نياز به ادامه جستجو بود بايد چک کني که اگه زير شاخه داشت اونوقت خود اين شاخه رو به عنوان پارامتر به يک تابع ديگه بفرستي
حالا توي اون تابع بايد شما چک کني که عبارت وجود داره و اگه نياز به ادامه جستجو بود باز چک کني که زير شاخه داره يا نه و اگه داشت باز همين شاخه رو به عنوان پارامتر به همين تابع بفرستي ( بحث توابع بازگشتي )
خوب اين فلوچارت برنامه بود بقيش با خودت چون وقت نوشتن برنامه رو نداشتم زحمتش به عهده خودت ميفته

2- راه دوم که خيلي ساده تر هستش ولي استاندارد نيست

شما موقع پر کردن آيتمهاي درخت يک تاج (Tag) واسه هر کدوم بذار و توي يک ديتاتيبل خود عبارات درخت و همچنين تاج مربوطه رو ذخيره کن
خوب بقيش ديگه راحته شما جستجو رد توي آيتمهاي ديتاتيبلت انجام ميدي و وقتي درست بود کافيه تاج مربوطه رو از ستون تاج بخوني(Yourtag) و توي دستور زير قرار بدي تا خودش شاخه مورد نظر رو Select کنه و وقتي سلکت شد ميتوني آيتم رو با دستور SelectedItem هر کار خواستين روش انجام بدين مثل بولد کردن


TreeView1.SelectedNode = TreeView1.Nodes.Find(Yourtag, True)(0)

Saman_12
شنبه 13 شهریور 1389, 11:56 صبح
دوست عزيز براي اينکار دو روش وجود دارد

1- شما بايد ابتدا شاخه اصلي رو با يک حلقه مرور کني بعد در هر بار تکرار حلقه وجود زير شاخه توي شاخه اصلي رو چک کني و اگه موردي که سرچ ميکني توي اين درخت بود که پيغام لازم رو ميده و اگه نياز به ادامه جستجو بود بايد چک کني که اگه زير شاخه داشت اونوقت خود اين شاخه رو به عنوان پارامتر به يک تابع ديگه بفرستي
حالا توي اون تابع بايد شما چک کني که عبارت وجود داره و اگه نياز به ادامه جستجو بود باز چک کني که زير شاخه داره يا نه و اگه داشت باز همين شاخه رو به عنوان پارامتر به همين تابع بفرستي ( بحث توابع بازگشتي )
خوب اين فلوچارت برنامه بود بقيش با خودت چون وقت نوشتن برنامه رو نداشتم زحمتش به عهده خودت ميفته

2- راه دوم که خيلي ساده تر هستش ولي استاندارد نيست

شما موقع پر کردن آيتمهاي درخت يک تاج (Tag) واسه هر کدوم بذار و توي يک ديتاتيبل خود عبارات درخت و همچنين تاج مربوطه رو ذخيره کن
خوب بقيش ديگه راحته شما جستجو رد توي آيتمهاي ديتاتيبلت انجام ميدي و وقتي درست بود کافيه تاج مربوطه رو از ستون تاج بخوني(Yourtag) و توي دستور زير قرار بدي تا خودش شاخه مورد نظر رو Select کنه و وقتي سلکت شد ميتوني آيتم رو با دستور SelectedItem هر کار خواستين روش انجام بدين مثل بولد کردن


TreeView1.SelectedNode = TreeView1.Nodes.Find(Yourtag, True)(0)

Hero جان مثل این که شما توی تالار 6 سر نمی زنی جواب این بنده خدا رو توی تالار 6 دادند و ایشون هم راضیه.

ali190
شنبه 13 شهریور 1389, 12:36 عصر
ممنون از hero4000 و Saman_12 عزیز
دم هر وی شما عزیزان گرم
واقعاً خیلی لطف کردین
مشکل اولم حل شد
یک سئوال دیگه هم داشتم:
چطور میتونم در tree view با زدکمه مثلاً سطح1 فقط تا گره های level1 رو باز کنم نه بقیه رو
یعنی هر چی گره در سطح1 شاخه درخت هست باز بشه نه شاخه های بعد از اون
به فایل ضمیمه توجه بفرمائید زمانیکه کل شاخه درخت رو باز میکنید میبینید که شاخه های هم سطح همگی با نام سطح یکسان نام گذاری شده اند چون همگی در یک level واقع شده اند
یک سری دکمه اونجا تعبیه کردم " سطح1 تا 5"
میخوام زمانیکه مثلاً روی سطح 1 کلیک میکنم نمودار فقط سگره های سطح 1 رو بهم نمایش بده نه سطح2 رو
وقتی روی دکمه سطح2 کلیک میکنم نمودار فقط سطح 2 رو بهم نشون بده ، خوب طبیعی هست که در این سطح حتماً قبلش باید سطح 1 آشکار شده باشد چون سطح2 فرزند سط1 هست
پس میشه این رو تبدیل به یک قانون کرد که وقتی دکمه سطح x رو فشار میدم تمام گره های سطح x و گره های ماقبلش نمایش داده بشه نه مابعدش.
من فقط میتونم برای آخرین سطح این کار رو انجام بدم
مثلاً شما برای نمونه رو دکمه سطح0 و سطح 4 کلیک کنید.
امیدوارم منظورم رو رسونده باشم
ممنون
یاعلی

hero4000
شنبه 13 شهریور 1389, 13:05 عصر
دوست عزيز من برنامه شما رو دانلود کردم ولي برنامه شما با 6 نوشته شده است که متاسفانه بنده 6 روي سيستمم ندارم و توي اونهم اونقدر تخصص ندارم

شرمندم که نميتونم کمکي به شما بکنم

vbhamed
شنبه 13 شهریور 1389, 14:15 عصر
سلام

اينم براي سطوح