PDA

View Full Version : ایجاد search و سطح بندی در tree view



ali190
سه شنبه 09 شهریور 1389, 19:04 عصر
باسلام و عرض خسته نباشید خدمت تمامی دوستان گرامی
دوستان بنده در فایل پیوستی یک نمونه از نمودار tree view قرار دادم که میخوام در واقع از طریق ایجاد ارتباط بین این نمودار و یک دیتابیس اکسس ، اطلاعاتم رو از طریق این نمودار وارد دیتابیس کنم
اما مشکلم در اینجاست:
1) چون حجم اطلاعات و تعداد شاخه های این نمودار در پروژه من خیلی زیاد میشه و دسترسی سریع به اطلاعات هم برام سخت میشه ، میخواستم توسط یک تکست باکس و یک دکمه برای این نمودار یه سیستم سرچ ساده درست کنم که با وارد کرد کلمه مدنظر اون شاخه منطبق با کلمه کلیدی select شود و با زدن دوباره دکمه به شاخه منطبق دیگر (منطبق با کلمه کلیدی) برود مثل find next برنامه هایی مثل word و اکسل و...
2) یک سری دکمه هم وجود دره که میخوام با کلیک بر روی اونها سطح مشخصی از نمودار به نمایش دربیاد
مثلاً وقتی رو دکمه سطح1 کلیک میکنم فقط سطح یک نمودار باز بشه و وقتی روی دکمه سطح3 کلیک میکنم نمودار فقط تا سطح3 نمایش داده بشه نه بیشتر و همینطور الی آخر
مثلاً الان زمانیکه بر روی منوی Expand کلیک میکنیم تمام سطوح نمودار نمایش داده میشه.
بعد یک سئوال دیگه هم دارم:
چرا کار با این tree view اینقدر سخته؟
آیا کنترل مشابهی وجود ندارد که کار باهاش راحت تر و برقراری ارتباطش با دیتابیس هم راحت تر باشه وجود نداره؟
ممنون

ali190
سه شنبه 09 شهریور 1389, 21:52 عصر
باسلام
با سرچ در اینترنت این کدها رو پیدا کردم:

Search a treeview for a item
The following code can be used to search a treeview for an item of text:
'Purpose : Performs a recallable search on a treeview.
'Inputs : tvFind The treeview to search.
' sFindItem The text to search for (supports wildcards)
' [bSearchAll] If True will search all nodes of the treeview, else
' will only search top level nodes.
' [lItemIndex] If specified will return this matching index.
' eg, if set to 2 then will return the second node which matches the search criteria.
'Outputs : Returns the a matching treeview node or nothing if the item is not found

Function TreeViewFindNode(tvFind As TreeView, ByVal sFindItem As String, Optional bSearchAll As Boolean = True, Optional lItemIndex As Long = 1) As Node
Dim oThisNode As Node, bSearch As Boolean, lInstance As Long

sFindItem = UCase$(sFindItem)
bSearch = True

For Each oThisNode In tvFind.Nodes
If bSearchAll = False Then
'Only Search Top Level Nodes
If (oThisNode.Parent Is Nothing) = False Then
bSearch = False
Else
bSearch = True
End If
End If
If bSearch Then
If (UCase$(oThisNode.Text) Like sFindItem) = True Then
lInstance = lInstance + 1
If lInstance >= lItemIndex Then
'Found matching item
Set TreeViewFindNode = oThisNode
Exit For
End If
End If
End If
Next
End Function

Sub Test()
Dim lItemIndex As Long, oFoundNode As Node
Do
lItemIndex = lItemIndex + 1
Set oFoundNode = TreeViewFindNode(tvAccounts, "Red", True, lItemIndex)
If tvAccounts Is Nothing Then
'Didn't find any more items
Exit Do
End If
oFoundNode.EnsureVisible
If MsgBox("Found " & oFoundNode.Text & vbNewLine & "Find next matching item? ", vbQuestion + vbYesNo) = vbNo Then
Exit Do
End If
Loop
End Sub

میشه از تون خواهش کنم این کدها رو در قالب یک پروژه vb بیارید.
در ضمن یک سایت رو هم پیدا کردم که درش یک sample و نمونه فایل گذاشته بود
ولی متاسفانه نتوستم اون رو در vb شبیه سازی کنم
این هم آدرسش:

http://www.dotnetheaven.com/Uploadfile/mahesh/TreeSearch05212005073628AM/TreeSearch.aspx?ArticleID=d1508a1c-e2ce-4377-8b31-703568f063ff

این سایت هم درش نمونه کد هست :
http://vbcity.com/forums/p/35880/148075.aspx



ممنون میشم با الهام از منابع فوق بنده رو راهنمایی بفرمائید.

parselearn
چهارشنبه 10 شهریور 1389, 20:29 عصر
براي جستجو:


Dim j As Integer, c As Integer

Private Sub Command1_Click()
For j = c To TV1.Nodes.Count - 1
If TV1.Nodes.Item(j).Text = text1.Text Then
'MsgBox TV1.Nodes.Item(j).FullPath
c = c + 3
TV1.Nodes.Item(j).Selected = True
TV1.SetFocus
Exit For
End If
Next
End Sub

ali190
چهارشنبه 10 شهریور 1389, 20:59 عصر
سلام
کدهارو اجرا کردم ارور داد؟
آیا این کدها سرچ رو بصورت find next هم انجام میده
آخه احتمال داره در یک نمودار شاخه درخت ما از یک اسم 3 تا داشته باشیم.

منون

ali190
چهارشنبه 10 شهریور 1389, 22:05 عصر
باسلام


براي جستجو:
کد:


Dim j As Integer, c As Integer

Private Sub Command1_Click()
For j = c To TV1.Nodes.Count - 1
If TV1.Nodes.Item(j).Text = text1.Text Then
'MsgBox TV1.Nodes.Item(j).FullPath
c = c + 3
TV1.Nodes.Item(j).Selected = True
TV1.SetFocus
Exit For
End If
Next
End Sub


من کدها رو طبق فایل ضمیمه که خدمتتون گذاشتم جاگذاری کردم ولی خطای زیر رو دریافت کردم: (http://barnamenevis.org/forum/attachment.php?attachmentid=55214&stc=1&d=1283406169)


http://barnamenevis.org/forum/attachment.php?attachmentid=55195&stc=1&d=1283409670

من در واقع میخوام با استفاده از یک حلقه تمامی node های این tree view مورد جستجو قرار بگیره و هر وقت که مقدارش با مقدار text1 برابر بود سلکت بشه
مثال:
فرض کنید در یک نمودار شاخه درخت من از کلمهABC چهار تا دارم
عملیات سرچ انجام میشه اولین ABC پیدا میشه بعد

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

For Each node In tv1.nodes


ممنون میشم کمکم کنید

محسن شامحمدی
پنج شنبه 11 شهریور 1389, 10:26 صبح
بیا علی جان کدتو درستش کردم
مشکلش خیلی ساده بود
من فقط این قسمتو
For j = c To TV1.Nodes.Count - 1
رو به این صورت تغییر دادم
For j = 1 To TV1.Nodes.Count - 1

چون Node شماره 0 وجود نداشت ارور می داد و من بهش گفتم از node شماره 1 شروع کن
موفق باشی:قلب:

ali190
پنج شنبه 11 شهریور 1389, 11:55 صبح
سلام
ممنون از همه شما عزیزان
ولی در همون مثال بالا مثلاً از کلمه cat دوتا در این نمودار وجود دارد
با این کد فقط یکی از اونها پیدا میشه نه هر دو اونها!؟

parselearn
پنج شنبه 11 شهریور 1389, 12:56 عصر
Dim j As Integer, c As Integer

Private Sub Command1_Click()
'TV1.Nodes(j).Text
'MsgBox TV1.Nodes.Item(9).Text
For j = c To TV1.Nodes.Count
'MsgBox CStr(j) & ": " & TV1.Nodes.Item(j).Text
If TV1.Nodes.Item(j).Text = text1.Text Then
'List1.AddItem j
'MsgBox TV1.Nodes.Item(j).FullPath
c = j + 1
'MsgBox TV1.Nodes.Item(j).Text
TV1.Nodes.Item(j).Selected = True
TV1.SetFocus
Exit For
End If
c = 1
Next
End Sub

Private Sub Form_Load()
c = 1
End Sub

ali190
پنج شنبه 11 شهریور 1389, 13:18 عصر
ممنون parselearn (http://barnamenevis.org/forum/member.php?u=48732) عزیز از جوابی که دادی واقعاً عالی بود
فقط 3 تا درخواست کوچیک:
الف) اگر موردی یافت نشد پیغام دهد که "موردی یافت نشد"
ب) زمانیکه به پایان حلقه رسید و تمام موارد رو جستجو کرد پیغام بدهد که "پایان جستجو"
ج) آیا این امکان هست که بعد از پایان حلقه و اتمام جستجو بازدن روی کمه جستجو دوباره حلقه جستجو تکرار گردد؟
آقا شرمنده
خیلی شما رو اذیت کردم و زحمت دادم
واقعاً ممنون

parselearn
پنج شنبه 11 شهریور 1389, 15:10 عصر
1 - يك متغيير منطقي
2- شرط پاسخ 3
3- اين كد رو بعد از حلقه اضافه كنيد
If TV1.Nodes.Count + 1 = c Then c = 1




Dim b As Boolean
'TV1.Nodes(j).Text
'MsgBox TV1.Nodes.Item(11).Text
For j = c To TV1.Nodes.Count
'MsgBox CStr(j) & ": " & TV1.Nodes.Item(j).Text
If TV1.Nodes.Item(j).Text = text1.Text Then
'List1.AddItem j
'MsgBox TV1.Nodes.Item(j).FullPath
c = j + 1
'MsgBox TV1.Nodes.Item(j).Text
TV1.Nodes.Item(j).Selected = True
TV1.SetFocus
b = True
Exit For
End If
Next
If b = False Then MsgBox "Not Found"
If TV1.Nodes.Count + 1 = c Then c = 1

parselearn
پنج شنبه 11 شهریور 1389, 15:24 عصر
در مورد كد بالا در صورتي كه كلمه car را دوبار جستجو كنيد. پيغام Not Found دريافت مي كنيد
بهتره يك تابع جدا براي جستجو از ابتداي TV ايجاد كنيد كه در صورتي كه نبود پيغام دهد

If b = False and CheckExis(text1.Text) Then MsgBox "Not Found"كدش هم با كد اوليه شما فرقي نداره

ali190
پنج شنبه 11 شهریور 1389, 15:49 عصر
ممنون
از پاسختون
این کد رو به کدوم قسمت از sub اضافه کنم؟

parselearn
پنج شنبه 11 شهریور 1389, 15:58 عصر
If b = False Then MsgBox "Not Found"
Replace->
If b = False & CheckExis(text1.Text) Then MsgBox "Not Found"


CheckExis مثلا تابع چك كردن شما از ابتداي TV

ali190
پنج شنبه 11 شهریور 1389, 16:03 عصر
ممنون
کد رو اجرا میکنم به من ارور میده
مگه نباید از قیل تابع CheckExis رو قبلاً ایجاد کرده باشم؟

ali190
جمعه 12 شهریور 1389, 11:55 صبح
باسلام
میخوام در text1 عملیات جستجو به تمام کلمات مشابه هم بیرون کشیده شود
مثلاً زمانی که کلمه خودکار رو سرچ میزنم
تمام کلمات زیر مثلاً سرچ شود
خودکار آبی
خودکار سبز
خودکار سیاه
خلاصه هر کلمه ای که درش خودکار وجود دارد
فکر کنم باید از عملگر like استفاده کنم
ولی نمیدونم چطوری
میشه راهنماییم کنید؟
ممنون

parselearn
جمعه 12 شهریور 1389, 13:59 عصر
از like هم ميشه
http://msdn.microsoft.com/en-us/library/swf8kaxw.aspx
از instr هم ميشه
http://msdn.microsoft.com/en-us/library/8460tsh1%28VS.80%29.aspx
نمونش هم در سايت زياده