سلام
چشم من توضیح میدم اما مثل شما دوستان نمی تونم فنی صحبت کنم چون مطالعاتم کمه.
اول بگم که من از یک جدول استفاده کردم و این ساختارم هم به این دلیل هستش. میشه از چند جدول استفاده کرد و ساختارتون(نمیدونم بهنر یا بدتر) رو عوض کنید
1) ساختار جدول
ببین دوست من ، اگر نگاه به جدول بکنی میبینی که من یه فیلد دارم به نام bintTakhsisCode که در حقیقت یه AutoNomber بود (آخه از SQL) کپی کردم. به ازای هر رکورد یه کد اختصاص داده شده.
یک فیلد دیگه وجود داره به نام intTakhsisValue که نشون دهنده سطح رکورد مثلا سطح اول که همون "تخصیص نقدینگی" با کد 0 ذخیره شده و سطح دوم به طور مثال "تخصیص مستقیم" با کد 1 و ...........
فیلد سوم هم bintParentTakhsisCode که مقدار پدر هر رکورد از فیلد bintTakhsisCode مربوط به پدر خوانده شده و در رکورد مذکور در هنگام ایجاد ، ذخیره میشه.
به طور مثال " برق آبی " که زیر مجموعه " تخصیص مستقیم " قرار می گیرد دارای bintParentTakhsisCode برابر با عدد (2) می باشد که اگر به رکورد " تخصیص مستقیم " مراجعه شود و فیلد bintTakhsisCode انرا نگاه کنید خواهید دید که این رکورد همان عدد(2) را داراست.


2)کد فرم:
از دستورات زیر فقط قسمت fnFillTree رو توضیح میدم. سایر دستورات مربوط به فرم من بوده در Adp که استفاده می کردم و اینجا کاربردی ندارند به جز قسمت lonArray که اونم ماله رنگهاست

Dim ctlControls As control
If adorstSelect.State = 1 Then adorstSelect.Close
adorstSelect.Open "Select * From tblTakhsisTree Where nvcYeard='1384'", CurrentProject.Connection, adOpenDynamic, adLockPessimistic
If Not adorstSelect.EOF Then
For Each ctlControls In Me.Controls
If ctlControls.ControlType = acTextBox Or ctlControls.ControlType = acComboBox Or ctlControls.ControlType = acCheckBox Then
ctlControls.Value = ""
End If
Next ctlControls
lonAraye(0) = RGB(0, 0, 0): lonAraye(1) = RGB(0, 0, 255): lonAraye(2) = RGB(0, 125, 0): lonAraye(3) = RGB(255, 0, 0)
lonAraye(4) = RGB(255, 0, 255): lonAraye(5) = RGB(105, 0, 0): lonAraye(6) = RGB(10, 205, 155): lonAraye(7) = RGB(128, 0, 0)
lonAraye(8) = RGB(0, 0, 160): lonAraye(9) = RGB(128, 0, 128): lonAraye(10) = RGB(128, 128, 64): lonAraye(11) = RGB(255, 128, 64)
lonAraye(12) = RGB(0, 128, 64): lonAraye(13) = RGB(0, 128, 255): lonAraye(14) = RGB(255, 128, 192): lonAraye(15) = RGB(255, 128, 192)
intRValue = 20
intGValue = 10
intBValue = 50
'*************** TreeView
Call fnFillTree
'*************** TreeView
End If
If adorstSelect.State = 1 Then adorstSelect.Close



در Function زیر


Function fnFillTree(Optional strPCode As String = "")
Dim intValue As Integer
'On Error Resume Next
If adorstSelectFill.State = 1 Then adorstSelectFill.Close
If strPCode = "" Then
adorstSelectFill.Open "Select * From tblTakhsisTree Where nvcYeard='1384' And bintParentTakhsisCode=" & intValue & " ORDER BY nvcPathTakhsisNo", CurrentProject.Connection, adOpenDynamic, adLockPessimistic
If Not adorstSelectFill.EOF Then
adorstSelectFill.MoveFirst
Do While Not adorstSelectFill.EOF
Set NdTakhsisTree = Me.trectlTakhsisTree.Nodes.Add(, , Trim("A" & Trim(Str(adorstSelectFill!bintTakhsisCode))), "(" & adorstSelectFill!nvcTakhsisNo & ")" & adorstSelectFill!nvcTakhsisTitle, 1)
If intValue <= 15 Then
NdTakhsisTree.ForeColor = lonAraye(intValue)
Else
Call fnLevelColor
NdTakhsisTree.ForeColor = RGB(RValue, GValue, BValue)
End If
adorstSelectFill.MoveNext
Loop
End If
If adorstSelectFill.State = 1 Then adorstSelectFill.Close
Else
Call fnAddNodeTree(strPCode)
End If
If adorstSelectFill.State = 1 Then adorstSelectFill.Close
End Function

strPCode ابتدا و برای بار اول خالی می باشد و در نتیجه فسمت اول دستور if اجرا شده و فقط رکورد " تخصیص نقدینگی" انتخاب شده و بوسیله

Set NdTakhsisTree = Me.trectlTakhsisTree.Nodes.Add(, , Trim("A" & Trim(Str(adorstSelectFill!bintTakhsisCode))), "(" & adorstSelectFill!nvcTakhsisNo & ")" & adorstSelectFill!nvcTakhsisTitle, 1)

رکورد اول به Tree اضافه می شود.

, Trim("A" & Trim(Str(adorstSelectFill!bintTakhsisCode))),

قسمت بالا در هنگام اضافه کردن در حقیقت همان ایجاد Code است یعنی شما به اضای هر رکوردی که در Tree نشان می دهید یک Key ما به ازا خواهید داشت . برای این مورد " تخصیص نقدینگی "دارای کد "A1" است.یعنی A بعلاوه bintTakhsisCode مربوط به رکورد " تخصیص نقدینگی "
و کدهای زیر مربوط به تخصیص رنگ می باشند

If intValue <= 15 Then
NdTakhsisTree.ForeColor = lonAraye(intValue)
Else
Call fnLevelColor
NdTakhsisTree.ForeColor = RGB(RValue, GValue, BValue)
End If

و سطح اول ایجاد میشود.
سپس بر روی هر سطح که DblClick کنید سطح بعدی از جدول انتخاب شده و با توجه به کلید سطح خود و bintParentTakhsisCode در Tree با استفاده از کد

Call fnAddNodeTree(strPCode)

ایجاد میشود.