PDA

View Full Version : مشکل در کار با ابزار Tree View



Restlesa
شنبه 05 آذر 1390, 23:32 عصر
سلام بر همگی دوستان
در حال نوشتن برنامه ای هستم که تو از کامپوننت Tree View ابزار کدجاکس استفاده کردم
مشکل من این هستش که وقتی Tab 1 فعال هتتش و یک سری اطلاعات دید به Tree View اضافه می کنم بدون هیچ مشکلی این کار انجام می شه و همین عمل هم در Tab 2 هم بدون مشکل انجام می شه ولی وقتی که از Tab 2 به Tab 1 سوئیچ می کنم و می خوام یه سری اطلاعات جدید به Tree View تب Tab 1 اضافه کنم این عمل بر انجام نمیشه و به ابزار Tree View تب Tab 2 اضافه میشه
برای فهم بیشتر یه نمونه کد در ادامه ضمیمه کردم
خودمم 78430خیلی باهاش ور رفتم اما نتونستم راه حلش رو پیدا کنم این شد که مزاحم شما دوستان عزیز شدم
منتظر راهنمایی هاتون هستم

Restlesa
یک شنبه 06 آذر 1390, 19:43 عصر
کسی از دوستان نیست که منو راهنمایی کنه

ali190
یک شنبه 06 آذر 1390, 21:05 عصر
سلام
من با Treeview تقریباً خیلی کار کردم
فکر کنم بتونم کمکت کنم
اما به شرطی که سئوالت رو خیلی خیلی دقیق مطرح کنی ، سعی کن سئوالت رو روی نمونه مطرح کنی و دقیقاً به موارد موجود در نمونه پیوستی اشاره کنی
حقیقتش از پست اول چیزی دستگیرم نشد
یاعلی

Restlesa
دوشنبه 07 آذر 1390, 17:21 عصر
مشکلم رو با طرح یه مثال توضیح میدم
وقتی برنامه رو اجرا می کنم به طور پیش فرض یک تب با نام New DataBase 1 ایجاد میشه ... حالا می خوام وقتی که بر روی گزینه New از گروه Category کلیک می کنم بتونم یه زیر منو به منوی اصلی URL Bookmark اضافه کنم.
اسم این زیر منو رو در پنجره Add New Category رو Barnamenevis انتخاب می کنم و با زدن دکمه Ok این اسم رو به عنوان زیر منوی URL Bookmark به منوم اضافه می کنم ... تا اینجا برنامه ام بدون هیچ مشکلی کار میکنه و زیر منوی مذکور به منوی اصلی تب New DataBase 1 اضافه میشه ... حال این بار بر روی گزینه New از منوی File کلیک می کنم و یه تب جدید به نام New DataBase 2 ایجاد می کنم و مانند قبل این بار یک زیر منو به اسم مثلا Google به منوی اصلی تب New DataBase 2 اضافه می کنم ... این عملیات هم در تب New DataBase 2 بدون هیچ مشکلی اجرا میشه ... اما مشکلم از اینجا به بعد هستش ... یعنی وقتی که از تب New DataBase 2 به New DataBase 1 سوییچ می کنم و می خوام یه زیر منو به نام مثلا Yahoo رو به منوی اصلی URL Bookmark تب New DataBase 1 اضافه کنم ... اما این زیر منو در منوی اصلی تب New DataBase 1 اضافه نمیشه بلکه در منوی اصلی تب New DataBase 2 اضافه میشه در حالی که من در تب New DataBase 1 هستم
این مشکل در تب های بعدی که ایجاد می کنم هم وجود داره ... یعنی وقتی تب New DataBase 3 رو ایجاد کنم و بعد از اون بخوام زیر منوهایی رو به منوی اصلی تب های New Data Base 1 و New DataBase 2 اضافه کنم در منوی اصلی New DataBase 3 اضافه میشه

اگر نمونه ضمیمه شده در پست 1 رو دانلود کنی کارهایی رو گه گفتم رو انجام بدی حتما متوجه مشکل خواهی شد

منتظر راهنمایی هات هستم

ali190
دوشنبه 07 آذر 1390, 18:39 عصر
سلام
به نمونه پیوستی یه نگاه بنداز و نتیجه رو بگو
یاعلی

Restlesa
سه شنبه 08 آذر 1390, 17:08 عصر
ممنونم دوست عزیز اما مشکلم هم چنان پابرجاست
میشه بگی کد زیر چی کار می کنه ؟؟؟
TreeView.Nodes.Add "main", tvwChild, "I3", "New DataBase 1"

ali190
سه شنبه 08 آذر 1390, 18:26 عصر
سلام
این کد یک زیر فرزند که گره اولیه شما اضافه مکنه

Restlesa
سه شنبه 08 آذر 1390, 20:53 عصر
دوست عزیز مثل اینکه شما بازهم با توضیحی که در پست 4 دادم متوجه مشکلم نشدی
لطفا کارهایی رو که میگم انجام بده ... برنامه رو اجرا کن ... حال بر روی دکمه Add از گروه Category کلیک کن تا پنجره Add New Category نمایش داده بشه ... یه اسمی در مقابل کادر Name انتخاب کن (مثلا Google) و روی دکمه Ok کلیک کن ... همون طوری که مشاهده می کنی کلمه Google به عنوان زیر منو در منوی URL Bookmark قرار گرفته ... حالا روی دکمه New گروه File کلیک کن تا تب New DataBase 2 ایجاد بشه ... مثل قبل یه زیر منو با همون اسم Google ایجاد کن ... تا اینجا کار در تب New DataBase 1 و تب New DataBase 2 زیر منوی Google رو داریم ... حالا از تب New DataBase 2 به تب New DataBase 1 سوئیچ کن ... حالا یه زیر منو به اسم Yahoo ایجاد کن ... حال می بینی که اینبار زیر منوی Yahoo در منوی URL Bookmark تب New DateBase 1 نیست ... این زیر منو (Yahoo) در منوی URL Bookmark تب New DataBase 2 ایجاد شده و قرار گرفته
مشکل من هم دقیقا همینه ... وقتی که از تب فعلی به تب های قبلی سوئیچ می کنم و می خوام زیر منویی به یکی از تب ها قبلی اضافه کنم این کار صورت نمی گیره و به زیر منو منوی اصلی آخرین تب اضافه میشه
چه طوری باید این مشکل رو بر طرف کنم ؟؟؟
دوستان خواهشا کمکم کنید :گریه::گریه::گریه:

Restlesa
چهارشنبه 09 آذر 1390, 18:54 عصر
کسی نیست کمکم کنه ؟؟؟

Restlesa
جمعه 11 آذر 1390, 18:39 عصر
آقا كسي نيست كمكم كنه ؟؟؟

Restlesa
سه شنبه 15 آذر 1390, 20:20 عصر
دوستان این سومی اسپمی هستش که میزارم
تو این چمد روزه هم اینترنت رو خیلی جستجو کردم اما نتونستم مشکلم رو بر طرف کنم
خواهشا کمکم کنید

Restlesa
چهارشنبه 16 آذر 1390, 12:29 عصر
:گریه::گریه::گریه::گریه::گریه: :گریه:

محسن واژدی
شنبه 19 آذر 1390, 20:41 عصر
سلام
کدهای زیر را در ماژول فرم frmDocument جایگزین کنید:

Private mCFPB As frmPaneBookmark

Sub CreateShortcutBar()
Dim mailIconArray As Long
Dim Item As ShortcutBarItem, ItemMail As ShortcutBarItem
Set mCFPB = New frmPaneBookmark
Set FPB = mCFPB
Set ItemMail = ShortcutBar.AddItem(888, "Bookmarks", mCFPB.hWnd)
ShortcutBar.Icons = MainForm.ImageManager.Icons
ShortcutBar.Selected = ItemMail
End Sub


Private Sub Form_Activate()
On Error Resume Next
Set FPB = mCFPB
End Sub

Private Sub Form_Load()
CreateShortcutBar
End Sub

Private Sub Form_Resize()
On Error Resume Next
TabMain.Width = Me.ScaleWidth
TabMain.Height = Me.Height - 500
ShortcutBar.Height = TabMain.Height - 410
End Sub


موفق باشید

Restlesa
یک شنبه 20 آذر 1390, 19:57 عصر
یک دنیا ممنونم دوست عزیز
یه سوال دیگه هم در مورد این ابزار داشتم
ابزار TreeView من در هنگام اجرای برنامه دارای سه منو به اسم های URL Bookmark و Trash و Top Sites هستش ... می خوام وقتی که یه زیر منو به منوی URL Bookmark اضافه کنم قبلش بیاد TreeView رو سرچ کنه که آیا این زیر منو قبلا اضافه شده یا خیر
خب حالا به قطعه کد زیر توجه کن :
For i = 1 To FPB.TreeView.Nodes.Count

همون طوری که خودتونم می دونی این قطعه کد میاد و تمامی منوها و زیر منو های TreeViewرو سرچ می کنه
مشکل من اینجاست که می خوام این عملیات جستو تنها در زیر شاخه منوی URL Bookmark صورت بگیره
میشه در این زمینه هم راهنماییم کنی ؟؟؟

کد کامل :
If txtName.Text = "" Then
txtName.SetFocus
Else
NewAUCFile.Name = Trim(txtName.Text)
NewAUCFile.Created = Trim(txtCreated.Text)
NewAUCFile.Description = Trim(txtDescription.Text)

For i = 1 To FPB.TreeView.Nodes.Count
If FPB.TreeView.Nodes.Item(i).Key = Trim(NewAUCFile.Name) Or FPB.TreeView.Nodes.Item(i).Text = Trim(NewAUCFile.Name) Then
MsgBox "The name you entered has allready been used ...", vbExclamation + vbOKOnly
txtName.Text = ""
txtDescription.Text = ""

NewAUCFile.Name = ""
NewAUCFile.Created = ""
NewAUCFile.Description = ""

txtName.SetFocus
Exit Sub
End If
Next

On Error Resume Next
If FPB.TreeView.SelectedItem.Key = "Top Sites" Then
MsgBox "This category already exists.", vbExclamation + vbOKOnly
Exit Sub
End If
If FPB.TreeView.SelectedItem.Key = "Trash" Then FPB.TreeView.Nodes.Item(1).Selected = True


FPB.TreeView.Nodes.Add FPB.TreeView.SelectedItem.Key, 4, Trim(NewAUCFile.Name), Trim(NewAUCFile.Name)
FPB.TreeView.Nodes.Item(FPB.TreeView.SelectedItem. Key).Expanded = True
FState(MainForm.ActiveForm.Tag).Dirty = True

Unload Me
End If

محسن واژدی
دوشنبه 21 آذر 1390, 00:40 صبح
سلام
کد زیر رو جایگزین کد قبل کنید:

Private Sub cmdOk_Click()
If txtName.Text = "" Then
txtName.SetFocus
Else
NewAUCFile.Name = Trim(txtName.Text)
NewAUCFile.Created = Trim(txtCreated.Text)
NewAUCFile.Description = Trim(txtDescription.Text)
Dim xNode As TreeViewNode
Set xNode = FPB.TreeView.Nodes("URL Bookmark").Child
For i = 1 To FPB.TreeView.Nodes("URL Bookmark").Children

If xNode.Key = Trim(NewAUCFile.Name) Or xNode.Text = Trim(NewAUCFile.Name) Then
MsgBox "The name you entered has allready been used ...", vbExclamation + vbOKOnly
txtName.Text = ""
txtDescription.Text = ""
NewAUCFile.Name = ""
NewAUCFile.Created = ""
NewAUCFile.Description = ""

txtName.SetFocus
Exit Sub
End If
Set xNode = xNode.Next
Next

On Error Resume Next

If FPB.TreeView.SelectedItem.Key = "Top Sites" Then
MsgBox "This category already exists.", vbExclamation + vbOKOnly
Exit Sub
End If

If FPB.TreeView.SelectedItem.Key = "Trash" Then
FPB.TreeView.Nodes.Item(1).Selected = True
End If

FPB.TreeView.Nodes.Add "URL Bookmark", 4, Trim(NewAUCFile.Name), Trim(NewAUCFile.Name)
FPB.TreeView.Nodes.Item("URL Bookmark").Expanded = True
FState(MainForm.ActiveForm.Tag).Dirty = True

Unload Me
End If
End Sub


موفق باشید

Restlesa
دوشنبه 21 آذر 1390, 14:54 عصر
بازم ممنونم دوست عزیز
میشه یه لطف دیگه هم در حقم بکنید و بگید که دو دستور زیر جی کار می کنن ؟؟؟
Set xNode = FPB.TreeView.Nodes("URL Bookmark").Child
FPB.TreeView.Nodes("URL Bookmark").Children

محسن واژدی
دوشنبه 21 آذر 1390, 16:21 عصر
سلام

Set xNode = FPB.TreeView.Nodes("URL Bookmark").Child

این دستور آیتم مجموعه فعلی (child) را به شی xNode ارجاع میدهد
البته اگر "FPB.TreeView.Nodes("URL Bookmark").Child" را جاگزین xNode کنیم هم فرقی نمیکند (مشکلی پیش نمیاد) ولی خب همانطور که مشاهده میکنید دستور بالا خیلی طولانی تر است تا زمانی که آنرا ارجاع داده ایم و به طبع با تکرار نوشتن آن در روال خوانایی و ویرایش کد مشکلتر میشود؛ اما اگر از همان ابتدا آنرا به یک شی که در اینجا xNode است ارجاع دهیم سرعت ویرایش افزایش و کدها هم خواناتر میشوند


FPB.TreeView.Nodes("URL Bookmark").Children

این دستور هم تعداد زیرمجموعه های یک گره که در اینجا "URL Bookmark" است رو برمیگرداند

موفق باشید

Restlesa
سه شنبه 22 آذر 1390, 02:11 صبح
ممنونم
حالا سوال بعدی :لبخند:
چه طوری می تونم یه زیر منو رو از یه گروه به گروه دیگه انتقال بدم ؟؟؟
مثلا یه زیر منو با نام Barnamenevis در گروه Trash دارم ... چه طوری می تونم این زیر منو رو به گروه URL Bookmark اضافه کنم ؟؟؟

سوال بعدی هم که داشتم اینه که چه طوری می تونم یه منوی تو در تو درست کنم ؟؟؟
مثلا یه زیر منو با نام Barnamenevis به گروه URL Bookmark اضافه می کنم ... حال می خوام منوهای دیگه ای رو اینبار به گروه Barnamenevis اضافه کنم

ممنون میشم در این رابطه هم راهنماییم کنی

Restlesa
سه شنبه 22 آذر 1390, 20:13 عصر
:ناراحت::ناراحت::ناراحت::نار حت:

محسن واژدی
پنج شنبه 24 آذر 1390, 14:12 عصر
سلام
ضمیمه را بررسی کنید

موفق باشید

Restlesa
پنج شنبه 24 آذر 1390, 19:12 عصر
چه طوری می تونم یه زیر منو رو از یه گروه به گروه دیگه انتقال بدم ؟؟؟
مثلا یه زیر منو با نام Barnamenevis در گروه Trash دارم ... چه طوری می تونم این زیر منو رو به گروه URL Bookmark اضافه کنم ؟؟؟
دوست عزیز میشه رد این رابطه هم راهنماییم کنی ؟؟؟

محسن واژدی
پنج شنبه 24 آذر 1390, 20:40 عصر
این بخش هم در نمونه ای که در پست قبل بنده مشاهده میکنید وجود دارد (آیتم مورد نظر را انتخاب کنید و به شاخه مورد نظر DragDrop کنید

موفق باشید

Restlesa
جمعه 25 آذر 1390, 05:43 صبح
دوست عزیز این کار رو می خوام با استفاده از یه فرم دیگه انجام بدم
در این صورت چی ؟؟؟
از همون کد قسمت قبل می تونم استفاده کنم یا اینکه باید تغییر کنه ؟؟؟

محسن واژدی
جمعه 25 آذر 1390, 13:15 عصر
سلام
کد زیر را در یک ماژول کپی کنید:

Option Explicit

Private Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long

Enum UpDownArgs
Up
Down
End Enum

Public Sub NodeMove(tvTreeview As TreeView, Pos As UpDownArgs)
On Error Resume Next
Dim sLstIt$, sFstIt$, i%
Dim sSel$
Dim sRoot$
Dim sClsN$
Dim CItems As New Collection
Dim bxtv As Boolean
Dim xNode As Object
sLstIt$ = tvTreeview.SelectedItem.LastSibling.Key
sFstIt$ = tvTreeview.SelectedItem.FirstSibling.Key
sSel$ = tvTreeview.SelectedItem.Key

sClsN$ = String(50, Chr(0))
GetClassName tvTreeview.hwnd, sClsN$, 50
bxtv = Left(sClsN$, Len("SysTreeView32")) = "SysTreeView32"
Set xNode = tvTreeview.Nodes(tvTreeview.SelectedItem.Root.Key) .Child

If xNode Is Nothing Then tvTreeview.SetFocus: Exit Sub
If tvTreeview.SelectedItem.Root.Children = 1 Then Exit Sub

LockWindowUpdate tvTreeview.hwnd
Do
If Pos = Up Then
If sSel$ = sFstIt$ Then Exit Do

If Not xNode.Key = xNode.LastSibling.Key Then
If xNode.Next.Key = sSel$ Then
CItems.Add xNode.Next.Key
CItems.Add xNode.Key
Set xNode = xNode.Next
Else
CItems.Add xNode.Key
End If
Else
CItems.Add xNode.Key
End If

Else
If sSel$ = sLstIt$ Then Exit Do
If xNode.Key = sSel$ Then
CItems.Add xNode.Next.Key
If Not xNode.Key = sLstIt$ Then
CItems.Add xNode.Key
Set xNode = xNode.Next
End If

Else
CItems.Add xNode.Key
End If
End If

Set xNode = xNode.Next

Loop Until xNode Is Nothing

If CItems.Count Then
If bxtv Then
For i = 1 To CItems.Count
Set tvTreeview.Nodes(CItems(i)).Parent = tvTreeview.Nodes(tvTreeview.SelectedItem.Root.Key)
Next
Else
For i = CItems.Count To 1 Step -1
Set tvTreeview.Nodes(CItems(i)).Parent = tvTreeview.Nodes(tvTreeview.SelectedItem.Root.Key)
Next
End If
End If

LockWindowUpdate 0
tvTreeview.SetFocus
tvTreeview.Nodes(sSel$).Selected = True
End Sub


انتقال آیتم به بالای لیست:

NodeMove TreeView, Up


انتقال آیتم به پایین لیست:

NodeMove TreeView, Down


با کمی تغییر در کدها میتوانید دو خاصیت انتقال آیتم به ابتدا و انتقال به انتها را هم اضافه کنید

موفق باشید

Restlesa
شنبه 26 آذر 1390, 19:15 عصر
بازم ممنون
یه سوال دیگه هم دارم
چه طوری می تونم موقع اضافه کردن زیر منو به TreeView رو بر اساس حروف الفبای هم فارسی و هم انگلیسی Sort کنم ؟؟؟

rezavb6
چهارشنبه 20 اردیبهشت 1391, 23:34 عصر
سلام دوستان
من یک سورسی در مورد treeview میخوام که بتونهعنوان child های هر گره رو بهم بده مثلا
a
b
b1
b2
c
c1
c2

میخام این کار را بکونه
دکمه command را زدم یک msgbox باز بشه و
بهم بگه
aدو تا child داره به نام b و c
b دو تا child داره به نام b1 و b2
c دو تا child داره به نام c1 و c2
ممنون میشم راهنمایی کنید