PDA

View Full Version : سوال: ساختن TreeView با استفاده از بانك sql



eailia
دوشنبه 17 خرداد 1389, 00:04 صبح
دوستان سلام من يه روش براي ساختن تري ويو از بانك دارم، ولي اين روش براي ساختن يك نود و يك چايلد كافي است و براي ساختن ساختار هاي درختي چند پله‌اي بدرد نمي‌خورد، اگه روش سراع داريد راهنمايي كنيد.

hamedsabzian
دوشنبه 17 خرداد 1389, 02:04 صبح
بسته گی به مورد استفاده داره.
اگه اطلاعات پدر و فرزند در جداول جداگانه باشن و تعداد جداولی که به هم رابطه ی پدر-فرزندی دارن کم باشه، میتونی همه ی جدولا رو طبق رابطه ای که باهم دارن با هم LEFT OUTER JOIN کنی به صورتی که بچه ترین گره آخری ترین ستون باشه.
حالا با توجه به اینکه ستون ها از چپ با راست با هم رابطه ی پدر-فرزندی دارن می تونی در قالب یه حلقه Node های TreeView رو بسازی. (سخت نیست!)

اما اگه تعداد زیر درخت ها ثابت و کم نباشه:
باید مسئله مشخص باشه تا بشه راه حل خوب داد. (ممکنه لازم باشه با یه تابع بازگشتی Node ها رو بسازی و به هم ربط بدی).

eailia
دوشنبه 17 خرداد 1389, 09:09 صبح
اما اگه تعداد زیر درخت ها ثابت و کم نباشه:
باید مسئله مشخص باشه تا بشه راه حل خوب داد. (ممکنه لازم باشه با یه تابع بازگشتی Node ها رو بسازی و به هم ربط بدی).

دقيقا همينه من از يه فرم ديگه شاخه‌ها رو اضافه مي‌كنم و معين مي‌كنم كه زير مجموعه كدوم نود باشه، تعداد و نحوه قرار گرفتن اونها هم بستگي به ورودي اطلاعات از اون فرم داره، يعني يه درخت تو در تو.
اگه مي‌شه راجع به اون تابع بازگشتي توضيح بدي يا اگه كدي داري بدي

من از اين كد استفاده مي‌كنم:
Try
Dim cm As SqlCommand = New SqlCommand("SELECT pagesID ,pagesParent ,pagesName ,pagesCreator ,pagesCreateDate ,pagesStatus ,pagesPriority ,pageslink ,pagesLinkTarget FROM dbNews.dbo.tblPagesTree WHERE pagesParent = '0' AND pagesStatus <> 'deleted' order by pagesParent, pagesPriority", cn)
cn.Open()
Dim dr As SqlDataReader
dr = cm.ExecuteReader()
Dim ParentNode As String(,) = New String(100, 3) {}
Dim count As Integer = 0

While dr.Read()
ParentNode(count, 0) = dr.GetValue(dr.GetOrdinal("pagesID")).ToString()
ParentNode(System.Math.Max(System.Threading.Interl ocked.Increment(count), count - 1), 3) = dr.GetValue(dr.GetOrdinal("pagesName")).ToString()
ParentNode(count, 1) = dr.GetValue(dr.GetOrdinal("pageslink")).ToString()
ParentNode(count, 2) = dr.GetValue(dr.GetOrdinal("pagesLinkTarget")).ToString()


End While
dr.Close()

For [loop] As Integer = 1 To count
Dim root As New TreeNode()
root.Text = ParentNode([loop], 3)
root.Target = ParentNode([loop], 2)
root.NavigateUrl = ParentNode([loop], 1)

Dim Module_SqlCmd As New SqlCommand("SELECT pagesID ,pagesParent ,pagesName ,pagesCreator ,pagesCreateDate ,pagesStatus ,pagesPriority ,pageslink ,pagesLinkTarget FROM dbNews.dbo.tblPagesTree WHERE pagesParent = '" & ParentNode([loop] - 1, 0) & "' AND pagesStatus <> 'deleted' order by pagesParent, pagesPriority", cn)
Dim Module_Sdr As SqlDataReader = Module_SqlCmd.ExecuteReader()

While Module_Sdr.Read()
'siva To Add children module to the root node
Dim child As New TreeNode()
child.Text = Module_Sdr.GetValue(Module_Sdr.GetOrdinal("pagesName")).ToString()
child.Target = Module_Sdr.GetValue(Module_Sdr.GetOrdinal("pagesLinkTarget")).ToString()
child.NavigateUrl = Module_Sdr.GetValue(Module_Sdr.GetOrdinal("pageslink")).ToString()
root.ChildNodes.Add(child)
End While
Module_Sdr.Close()

TreeView2.Nodes.Add(root)
TreeView2.CollapseAll()
Next
Catch
Finally
cn.Close()
End Try

و اين تصوير منو درختي من است كه تا يك چايلد را نشان مي دهد

hamedsabzian
دوشنبه 17 خرداد 1389, 15:51 عصر
اینطور که معلومه تمام پدر-فرزندها در یک جدول اند.
یک تابع مینویسید که ورودیش یه TreeNode که به صورت ref پاس داده شده و نیز شماره پدر نودهایی که می خوان از DB خونده بشن:
private void MakeTree(ref TreeNode fatherNode,int fathrNumber)
داخل این تابع دستور SELECT رو براساس fatherNumber اجرا میکنی و نتایج رو به فرزندای fatherNode اضافه می کنی.
حالا برای هر کدوم از childNode هایی که اضافه کردی دوباره همین تابع رو از توی خودش فراخونی می کنی:

MakeTree(fatherNode.ChildNodes[i],fatherNode.ChildNodes[i].Value);

موفق باشید.