PDA

View Full Version : قرار دادن Space به تعداد زیرشاخه در اول یک فیلد



rezaei manesh
یک شنبه 10 تیر 1386, 18:37 عصر
سلام
من یک جدول دارم که نام قسمت ها در اون ثبت شده است به این صورت که هر رکورد یک نام و یک آی دی و یک پرنت آی دی داره(parentid در اصل ID رکورد ریشه اون هست )
نتیجه جدول به شکل درخت هست
حال من می خوام که این جدول رو در یک فرم خاص به صورت درختی نشون ندم
می خوام اونا رو زیر هم لیست کنم (در یک checklistbox) اما رکورد های هر شاخه زیر ریشه با یک space باشند
مثل
مدیریت
اداری
دبیرخانه
گردشی
نگهبانی
...
چه طور باید این کار رو بکنم
این کد رو نوشتم اما درست کار نمی کنه حق هم داره



Public Sub FillSections()
Dim tbl As New DataTable
With My.Forms.FrmSelectPersons.ChkLst1
For i As Int16 = 1 To tbl.Rows.Count - 1
FindChield(tbl, tbl.Rows(i - 1).Item("IdValue"))
Next
End With
End Sub
Private Sub FindChield(ByRef tbl As DataTable, ByVal intIdValue As Int32, Optional ByVal strSpace As String = "") ' As String
tbl.DefaultView.RowFilter = "IdParent = " & intIdValue
If tbl.DefaultView.Count = 0 Then
Return
Else
strSpace += " "
intIdValue = tbl.DefaultView(0)("IdValue")
strquery = strSpace & tbl.DefaultView(0)("NAMEValue").ToString & "{کد : " & tbl.DefaultView(0)("IdValue").ToString & "}"
My.Forms.FrmSelectPersons.ChkLst1.Items.Add(strque ry)

tbl.DefaultView(0).Delete()
FindChield(tbl, intIdValue, strSpace)
tbl.DefaultView.RowFilter = "IdParent = " & intIdValue
End If
End Sub

ghafoori
دوشنبه 11 تیر 1386, 06:57 صبح
دوست عزیز در این قسمت کد


strSpace += " "
intIdValue = tbl.DefaultView(0)("IdValue")
strquery = strSpace & tbl.DefaultView(0)("NAMEValue").ToString & "{کد : " & tbl.DefaultView(0)("IdValue").ToString & "}"
My.Forms.FrmSelectPersons.ChkLst1.Items.Add(strque ry)

tbl.DefaultView(0).Delete()
FindChield(tbl, intIdValue, strSpace)
tbl.DefaultView.RowFilter = "IdParent = " & intIdValue

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

rezaei manesh
دوشنبه 11 تیر 1386, 08:06 صبح
سلام
بله درسته حق با شماست من هم مشکل من همینه
برنامه بی نهایت می تونه ریشه داشته باشه و.. اما معمولا از 7-8 تا تجاوز دیگه نمی کنه و...
مشکل من اینه که موقع فراخوانی تابع از خوش باید مقدار id قبلی رو هم نگه دارم تا دوباره همونو فیلتر کنم و حالا اگه اون شاخه خودش زیر شاخه دیگری هم داشت باید id او هم نگه دارم و..
چیزی مثل پشته بایداستفاده کنم فکر کنم،نه ؟ اما چطوری؟

ghafoori
دوشنبه 11 تیر 1386, 13:19 عصر
دوست عزیز شما باید در هر تابع یک متغییر فیلتر هم تعریف کنید لازم نیست جدول را هم پاس بدید چون دوستان قبلا هم از من این سوال را کردند من یک مثال برای می گذارم به این تابع دقت کن همون است که شما می خواهید


Sub showchild(ByVal id As Integer, ByVal strSpace As String)
Dim a As Integer
Dim filter As String
Dim r As DataRowView
filter = "Idparent=" + id.ToString
Me.DataTable1BindingSource.Filter = filter
If Me.DataTable1BindingSource.Count > 0 Then
For a = 0 To Me.DataTable1BindingSource.Count - 1
r = Me.DataTable1BindingSource.Item(a)
Me.ListBox1.Items.Add(strSpace + r.Item(1).ToString)
showchild(r.Item(0), strSpace + " ")
Me.DataTable1BindingSource.Filter = filter
Next
End If

این هم کل پروژه
9524

__H2__
دوشنبه 11 تیر 1386, 14:16 عصر
سلام
من همین چند وقت قبل همچین چیزی میخواستم و مشکل را با فراخانی تابع به صورت تودر تو (خود فراخانی) حل کردم.
1-یعنی تابعی داشته باشید که ریشه و یک عدد پله را بگیرد!
2- تمام ریشه را برای Child ها اسکن کند و برای هر Child ای مجدداً خودش را فراخانی کند، ولی این بار عدد پله را یکی اضافه کند
3- و ال آخر!!! در نهایت شما میتوانید براساس عدد پله space به نقطه مورد نظر اضافه کنید.

rezaei manesh
دوشنبه 25 تیر 1386, 19:02 عصر
سلام
ببخشید که دیر جواب دادم
جواب شما رو دیده بودم اما چون رفته بودم رو یه پروژه دیگه (موقتاً) موندم تا جواب شما رو آزمایش کنم بعد .
که جواب هم درست بود آقای عفوری دقیقا همونی بود که من می خوام و.. بسیار بسیار متشکر
در کل از همه دوستان که راهنمایی فرمودند متشکرم