PDA

View Full Version : گفتگو: نحوه اتصال حساب كل بعنوان ريشه (Root) و حساب معين بعنوان فرزند(Child) در TreeView



y.saied
چهارشنبه 14 فروردین 1392, 20:30 عصر
'--------- Root
trvKol.Nodes.Clear()
Dim Con As New OleDbConnection("provider=microsoft.jet.oledb.4.0; data source=" & Application.StartupPath() & "\DBase.mdb")
Con.Open()

Dim CmdKol As New OleDbCommand("select * from Kol order by kolid asc", Con)
Dim DrKol As OleDbDataReader = CmdKol.ExecuteReader()
While DrKol.Read()
trvKol.Nodes.Add(DrKol("kolid").ToString & " : " & DrKol("kol").ToString)
End While

' -------- Child
Dim CmdMoein As New OleDbCommand("select * from Moein order by moeinid asc", Con)
Dim DrMoein As OleDbDataReader = CmdMoein.ExecuteReader()
While DrMoein.Read()
trvKol.Nodes.Item(0).Nodes.Add(DrMoein("moeinid").ToString & " : " & DrMoein("moein").ToString)
End While

DrKol.Close()
DrMoein.Close()

سلام
بنده با استفاده از کدهای بالاTreeView را به اکسس متصل میکنم.
تو ديتابيس اكسس دو تا جدول به نامهاي Kol و Moein دارم كه اين دو تا حساب رو بصورت One to Many بهمديگه اتصال دادم.

102303

102304

102305

102306

102307
حالا ميخوام در TreeView حسابهاي معين هر حساب كل بعنوان Child در زير شاخه همون حساب كل نمايش داده بشن.

gilsoft
پنج شنبه 15 فروردین 1392, 23:13 عصر
از اساتید کسی نمیخواد جواب بده ...

سلام دوست عزیز

اگه عجله نداری ... من دارم رو همین موضوع کار میکنم و به نتیجه هایی هم رسیدم ...

ولی تو یکی دو روز آینده میتونم سورس و توضیحاتش رو برات بزارم ...

y.saied
پنج شنبه 15 فروردین 1392, 23:42 عصر
سلام، ممنون مهندس جان
منتظر میمونمممممممممممممممممممم ممممممممممممممممم ... مرسی

سلام دوست عزیز

اگه عجله نداری ... من دارم رو همین موضوع کار میکنم و به نتیجه هایی هم رسیدم ...

ولی تو یکی دو روز آینده میتونم سورس و توضیحاتش رو برات بزارم ...

linux
جمعه 16 فروردین 1392, 00:20 صبح
از اساتید کسی نمیخواد جواب بده ...

تو بخش طراحی دیتابیس ها تو قسمت sql یک مبحث طولانی در این مورد هست
در هر صورت شما کلا برای پیاده سازی درخت فقط به یک جدول نیاز دارید

y.saied
جمعه 16 فروردین 1392, 00:31 صبح
یعنی امکان نمایش اطلاعات دو جدول در TreeView نیسسسسسسس؟؟؟؟؟؟؟؟!!!!!


تو بخش طراحی دیتابیس ها تو قسمت sql یک مبحث طولانی در این مورد هست
در هر صورت شما کلا برای پیاده سازی درخت فقط به یک جدول نیاز دارید

cherchil_hra
چهارشنبه 21 فروردین 1392, 09:07 صبح
اگه ساختار درختت دو سطحی هست (کل | معین) از این روش می تونی استفاده کنی:

1.اول از همه ریشه ها رو به درختت اضافه می کنی (کل) و بعد از اضافه کردن هر گره یک گره موقت بهش اضافه می کنی که بشه گره ریشه رو expand کرد، به این صورت:
TreeView1.Nodes.Add(key, text)
که key برابر با KolID میذاری و قسمت text هم متنی که می خوای

Dim tn As TreeNode
While DrKol.Read()
trvKol.Nodes.Add(DrKol("kolid"), DrKol("kolid").ToString & " : " & DrKol("kol").ToString)
tn.Nodes.Add("")
End While
TreeView1.ExpandAll()


در آخر این متد، تمام ریشه ها رو باز می کنیم، پس حالا می تونی از رویداد AfterExpand درختت استفاده کنی. به ازای باز شدن هر ریشه این event صدا زده میشه (اول node 1 بعد node 2 و ...)

2. اول گره ای که موقت ساخته بودیم رو پاکش می کنیم و بعد از جدول معین تمام مواردی رو میاریم که id کلشون برابر ریشه ای که رویداد رو صدا زده باشه. پس قسمت where به select شما اضافه میشه:

e.Node.Nodes.RemoveAt(0)
Dim s As String = e.Node.Name
Dim cmd As String = String.Format("select * from Moein where kolid={0} order by moeinid asc", s)

Dim CmdMoein As New OleDbCommand(cmd, Con)
Dim DrMoein As OleDbDataReader = CmdMoein.ExecuteReader()
While DrMoein.Read()
trvKol.Nodes.Item(0).Nodes.Add(DrMoein("moeinid").ToString & " : " & DrMoein("moein").ToString)
End While

به این ترتیب با باز شده هر گره ریشه، تمام بچه هاش بهش اضافه میشوند
موفق باشید!

arman_Delta2002
چهارشنبه 21 فروردین 1392, 10:32 صبح
Private Sub ListGroupLoaded()
Try
Dim II As Integer
Dim JJ As Integer
Dim ParnetNode1 As New TreeNode
Dim SubNode1 As New TreeNode

With TreeView_GrohHa1
.BeginUpdate()
For II = 0 To D_Acc_Kalaha_GroupBase_DataSet1.Tables("D_Acc_Kalaha_GroupBase").Rows.Count - 1
Label7.Text = D_Acc_Kalaha_GroupBase_DataSet1.Tables("D_Acc_Kalaha_GroupBase").Rows(II)("ID").ToString
ParnetNode1 = New TreeNode
ParnetNode1.Name = "Node" & II
ParnetNode1.Tag = Val(D_Acc_Kalaha_GroupBase_DataSet1.Tables("D_Acc_Kalaha_GroupBase").Rows(II)("ID").ToString) ' ایدی رو میریزیم تو تگ نود
ParnetNode1.Text = CStr(D_Acc_Kalaha_GroupBase_DataSet1.Tables("D_Acc_Kalaha_GroupBase").Rows(II)("Name").ToString())
.Nodes.Add(ParnetNode1)
Call Refresh_GroupSub()
For JJ = 0 To D_Acc_Kalaha_GroupSub_DataSet1.Tables("D_Acc_Kalaha_GroupSub").Rows.Count - 1
SubNode1 = New TreeNode
SubNode1.Name = "Node" & II & "_" & JJ
SubNode1.Text = CStr(D_Acc_Kalaha_GroupSub_DataSet1.Tables("D_Acc_Kalaha_GroupSub").Rows(JJ)("Name").ToString)
SubNode1.Tag = Val(D_Acc_Kalaha_GroupSub_DataSet1.Tables("D_Acc_Kalaha_GroupSub").Rows(JJ)("ID").ToString) ' ایدی رو میریزیم تو تگ نود
.Nodes(II).Nodes.Add(SubNode1)
Next JJ
Next II
.EndUpdate()
End With
Catch ex As Exception
MsgBox(ex)
End Try
End Sub


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

Call Refresh_GroupSub()

y.saied
چهارشنبه 21 فروردین 1392, 11:57 صبح
سلام جناب مهندس، ميشه خواهش كنم يه مثال بذارين
ممنون

اگه ساختار درختت دو سطحی هست (کل | معین) از این روش می تونی استفاده کنی:

1.اول از همه ریشه ها رو به درختت اضافه می کنی (کل) و بعد از اضافه کردن هر گره یک گره موقت بهش اضافه می کنی که بشه گره ریشه رو expand کرد، به این صورت:
TreeView1.Nodes.Add(key, text)
که key برابر با KolID میذاری و قسمت text هم متنی که می خوای

Dim tn As TreeNode
While DrKol.Read()
trvKol.Nodes.Add(DrKol("kolid"), DrKol("kolid").ToString & " : " & DrKol("kol").ToString)
tn.Nodes.Add("")
End While
TreeView1.ExpandAll()


در آخر این متد، تمام ریشه ها رو باز می کنیم، پس حالا می تونی از رویداد AfterExpand درختت استفاده کنی. به ازای باز شدن هر ریشه این event صدا زده میشه (اول node 1 بعد node 2 و ...)

2. اول گره ای که موقت ساخته بودیم رو پاکش می کنیم و بعد از جدول معین تمام مواردی رو میاریم که id کلشون برابر ریشه ای که رویداد رو صدا زده باشه. پس قسمت where به select شما اضافه میشه:

e.Node.Nodes.RemoveAt(0)
Dim s As String = e.Node.Name
Dim cmd As String = String.Format("select * from Moein where kolid={0} order by moeinid asc", s)

Dim CmdMoein As New OleDbCommand(cmd, Con)
Dim DrMoein As OleDbDataReader = CmdMoein.ExecuteReader()
While DrMoein.Read()
trvKol.Nodes.Item(0).Nodes.Add(DrMoein("moeinid").ToString & " : " & DrMoein("moein").ToString)
End While

به این ترتیب با باز شده هر گره ریشه، تمام بچه هاش بهش اضافه میشوند
موفق باشید!

gilsoft
پنج شنبه 22 فروردین 1392, 00:27 صبح
سلام، ممنون مهندس جان
منتظر میمونمممممممممممممممممممم ممممممممممممممممم ... مرسی

سلام دوست عزیز

این مثال رو ببین (خودم روش کار کردم) امیدوارم که مشکلتو حل کنه ...

موفق یاشید

cherchil_hra
پنج شنبه 22 فروردین 1392, 23:04 عصر
سلام جناب مهندس، ميشه خواهش كنم يه مثال بذارين
ممنون
توی پست قبلی، من با کدهای خودت مثال زدم. اینم کاملترش و البته تست شده با کدهای شما :

این آدرس db که قبل از متدهات تعریف می کنی تا در هردو قابل استفاده باشه:
Dim ConString As String = "provider=microsoft.jet.oledb.4.0; data source=" & Application.StartupPath() & "\DBase.mdb"


1.خوب اول قرار شده ریشه ها رو درست کنیم و برای هر ریشه یک بچه موقت. این متد رو می تونی با یک دکمه و یا موقع لود شدن فرم صدا بزنی:
Private Sub RootNode()
Try
trvKol.Nodes.Clear()
Dim Con As New OleDbConnection(ConString)
Con.Open()

Dim CmdKol As New OleDbCommand("select * from Kol order by kolid asc", Con)
Dim DrKol As OleDbDataReader = CmdKol.ExecuteReader()
Dim tn As TreeNode

While DrKol.Read()
Dim id As String = DrKol("kolid").ToString
Dim txt As String = DrKol("kolid").ToString & " : " & DrKol("kol").ToString
'ریشه
tn = trvKol.Nodes.Add(id, txt)
'بچه موقت
tn.Nodes.Add("")
End While

Con.Close()
trvKol.ExpandAll()

Catch ex As OleDb.OleDbException
MessageBox.Show(ex.Message, "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try

End Sub



2. در رویداد after expand بچه ها رو اضافه می کنی. اون گره ای که اول اضافه کردیم (بچه موقت هر ریشه) رو حذف می کنیم. توی پست قبلی من به اشتباه از اسم درخت استفاده کرده بودم که اینجا اصلاح شد (باید از متغیر e که داخلش node ریشه قرار داره استفاده بشه):

Private Sub trvKol_AfterExpand(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles trvKol.AfterExpand
Try
e.Node.Nodes.RemoveAt(0)
Dim RootID As String = e.Node.Name
Dim cmd As String = String.Format("select * from Moein where kolid={0} order by moeinid asc", RootID)

Dim Con As New OleDbConnection(ConString)
Con.Open()

Dim CmdMoein As New OleDbCommand(cmd, Con)
Dim DrMoein As OleDbDataReader = CmdMoein.ExecuteReader()
While DrMoein.Read()
e.Node.Nodes.Add(DrMoein("moeinid").ToString & " : " & DrMoein("moein").ToString)
End While

Con.Close()
Catch ex As OleDb.OleDbException
MessageBox.Show(ex.Message, "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try

End Sub

می تونی trvKol.ExpandAll استفاده نکنی و وقتی کاربر "+" هر ریشه رو زد رویداد AfterExpand اجرا میشه

موفق باشید!

y.saied
یک شنبه 25 فروردین 1392, 00:22 صبح
سلام، ممنون جناب مهندس
با لطف جنابعالي تونستم به جواب برسم، مشكلي كه دارم اينه كه با هر بار كليك بر روي ريشه اولي، زير مجموعه اين ريشه دوباره به ليست اضافه ميشه
بنده پايگاه داده رو ميذارم اگه ممكنه، لطف كنين و يه بار امتحانش كنين ممنون
http://iranprg.persiangig.com/DBase.rar


توی پست قبلی، من با کدهای خودت مثال زدم. اینم کاملترش و البته تست شده با کدهای شما :

این آدرس db که قبل از متدهات تعریف می کنی تا در هردو قابل استفاده باشه:
Dim ConString As String = "provider=microsoft.jet.oledb.4.0; data source=" & Application.StartupPath() & "\DBase.mdb"


1.خوب اول قرار شده ریشه ها رو درست کنیم و برای هر ریشه یک بچه موقت. این متد رو می تونی با یک دکمه و یا موقع لود شدن فرم صدا بزنی:
Private Sub RootNode()
Try
trvKol.Nodes.Clear()
Dim Con As New OleDbConnection(ConString)
Con.Open()

Dim CmdKol As New OleDbCommand("select * from Kol order by kolid asc", Con)
Dim DrKol As OleDbDataReader = CmdKol.ExecuteReader()
Dim tn As TreeNode

While DrKol.Read()
Dim id As String = DrKol("kolid").ToString
Dim txt As String = DrKol("kolid").ToString & " : " & DrKol("kol").ToString
'ریشه
tn = trvKol.Nodes.Add(id, txt)
'بچه موقت
tn.Nodes.Add("")
End While

Con.Close()
trvKol.ExpandAll()

Catch ex As OleDb.OleDbException
MessageBox.Show(ex.Message, "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try

End Sub



2. در رویداد after expand بچه ها رو اضافه می کنی. اون گره ای که اول اضافه کردیم (بچه موقت هر ریشه) رو حذف می کنیم. توی پست قبلی من به اشتباه از اسم درخت استفاده کرده بودم که اینجا اصلاح شد (باید از متغیر e که داخلش node ریشه قرار داره استفاده بشه):

Private Sub trvKol_AfterExpand(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles trvKol.AfterExpand
Try
e.Node.Nodes.RemoveAt(0)
Dim RootID As String = e.Node.Name
Dim cmd As String = String.Format("select * from Moein where kolid={0} order by moeinid asc", RootID)

Dim Con As New OleDbConnection(ConString)
Con.Open()

Dim CmdMoein As New OleDbCommand(cmd, Con)
Dim DrMoein As OleDbDataReader = CmdMoein.ExecuteReader()
While DrMoein.Read()
e.Node.Nodes.Add(DrMoein("moeinid").ToString & " : " & DrMoein("moein").ToString)
End While

Con.Close()
Catch ex As OleDb.OleDbException
MessageBox.Show(ex.Message, "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try

End Sub

می تونی trvKol.ExpandAll استفاده نکنی و وقتی کاربر "+" هر ریشه رو زد رویداد AfterExpand اجرا میشه

موفق باشید!

cherchil_hra
دوشنبه 26 فروردین 1392, 14:10 عصر
2 تا کار می تونی بکنی:
راه اول : متغیر سراسری تعریف کنی مثلا endJob و در sub RootNode بعداز trvKol.ExpandAll مقدار این متغیر رو برابر true قرار بدی. در رویداد trvKol_AfterExpand در خط اول بررسی می کنی اگه مقدارش true بود از رویداد خارج میشی:
If endJob = True Then Exit Sub

راه دوم : پس از اینکه تمام ریشه هات expand شدند، رویداد trvKol_AfterExpand را از درختت حذف کنی. یعنی در sub RootNode بعد از trvKol.ExpandAll این کد رو قرار بدی:
RemoveHandler trvKol.AfterExpand, AddressOf trvKol_AfterExpand
به این ترتیب پس از اجرای این خط، با expand و Collapse کردن گره ها، رویداد AfterExpand دیگر اجرا نخواهد شد.

موفق باشید!