PDA

View Full Version : مبتدی: اتصال Tree View به دیتابیس (تبدیل سورسVB6 به VB.net بدون استفاده از Wizard)



ali190
یک شنبه 07 فروردین 1390, 18:13 عصر
باسلام و عرض خسته نباشید خدمت همه دوستان عزیز
دوستان عزیز من با vb6+access یه سورس کد رو نوشته بودم که تو اون Tree View به دیتابیس متصل میشد
در این پروژه با استفاده از کتابخانه Adodb این مهم صورت گرفته
حالا میخوام کمکم کنید تا بتونم عملیات load کردن گره ها در این نمودار و همچنین افزودن گره ها در نمودار با استفاده از اشیاء vb.net (مثل dataadpter ، datatable و...) انجام بشه (عذر خواهی بنده رو بپیذیرید ، چون تو این بخش تازه کارم)
من توسنتم این کار رو با ویزارد تبدیل سورس کد vb6 به vb.net انجام بدم
اما همانطور که گفتم هدفم تبدیل توسط ویزارد نیست بلکه میخوام ایم مهم دقیقاً توسط متد های دیتابیسی vb.net انجام بشه
ممنون میشم راهنماییم کنید
یاعلی

ircast
یک شنبه 07 فروردین 1390, 18:32 عصر
سلام یه سری به این تاپیک بزنید

http://barnamenevis.org/showthread.php?280102-طرز-استفاده-از-treeview&p=1235905&highlight=#post1235905

ali190
یک شنبه 07 فروردین 1390, 18:44 عصر
سلام
اون تایپیک رو دیده بودم
همونطور که گفتم من یه مقدار مبتدیم
میشه ازتون خواهش کنم اون کدها رو نسبت به این پروژه اصلاح بفرمائید؟(یعنی نسبت هب فیلدهی دیتابیسم)
ممنون میشم ازتون
یاعلی

ircast
یک شنبه 07 فروردین 1390, 20:47 عصر
میشه ازتون خواهش کنم اون کدها رو نسبت به این پروژه اصلاح بفرمائید؟(یعنی نسبت هب فیلدهی دیتابیسم)


سلام ببخشید دیر شد ،من اون کد رو با VB.Net 2010 نوشتم براتون آما راستش من از Vb6 سر درنمیارم و کار نکردم

البته توی دیتابیستون یه تغییر کوچیک دادم که لازم بود

Imports System.Data.OleDb
Public Class Form1
Public Function InsertNode(ByVal N As TreeNode, ByVal PID As Integer) As Boolean
Try
Dim Con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\database.mdb")
Con.Open()
Dim Cmd As New OleDbCommand("SELECT * FROM Nodes WHERE Parent_ID=" + PID.ToString + " ORDER BY ID ", Con)
Dim Dr As OleDbDataReader = Cmd.ExecuteReader()
While Dr.Read()
Dim T As New TreeNode(Dr(1).ToString)
InsertNode(T, Convert.ToInt32(Dr(0)))
If N Is Nothing Then
TreeView1.Nodes.Add(T)
Else
N.Nodes.Add(T)
End If
End While
Dr.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
End Try
End Function
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
InsertNode(Nothing, 0)
End Sub
End Class

ali190
دوشنبه 08 فروردین 1390, 13:48 عصر
سلام دوستان
کدهایی که برای ثبت گره نمودار ، لود کردن گره ها و تعیین شماره Id گره جدید که میخواهیم ثبتش کنیم رو در اینجا ثبت میکنم تا دوستان کمکم کنند بتونم این ها رو با متدهای موجود در vb.net سازگار کنم
کد اول مربوط میشه به لود نمودن گره ها در نمودار شاخه درخت :

Private Sub local_fillTreeView()
Dim sqlQry As String
Dim xNode As Node
Dim xRsTemp1 As New ADODB.Recordset
Dim xParent As String
trV.Nodes.Clear
Set xNode = trV.Nodes.Add(, , "a", "Main Root", 2)
xNode.Expanded = True
sqlQry = ""
sqlQry = "select * from tblNodes order by nodeLevel, nodeText asc" ' where nodeLevel=1"
xRsTemp1.Open sqlQry, xConStr, adOpenDynamic, adLockOptimistic
With xRsTemp1
If Not .BOF Or Not .EOF Then
Do While Not .EOF
xParent = .Fields("childOf")
Set xNode = trV.Nodes.Add(xParent, tvwChild, .Fields("nodeId"), .Fields("nodeText"), 1)
.MoveNext
Loop
End If
.Close
End With
For Each xNode In trV.Nodes
If xNode.Children = 0 Then
xNode.Image = 3
End If
Next
End Sub
در مورد این تیکه از کد دوست خوبم جناب ircast لطف کردند و این کد رو برام در vb.net نوشتند
اما یه جا برام مبهم مونده
تا اونجایی که اطلاعات از جدول توسط dataadapter خونده میشه رو مشکلی باهاش ندارم
اونجایی که با این مقادیر لود شده treeview رو مقدار دهی میکنه مشکل دارم ، در کدهای vb6 که خودم نوشتم این جوری treeview رو مقدار دهی میکنم:
sqlQry = "select * from tblNodes order by nodeLevel, nodeText asc" ' where nodeLevel=1"
xRsTemp1.Open sqlQry, xConStr, adOpenDynamic, adLockOptimistic
With xRsTemp1
If Not .BOF Or Not .EOF Then
Do While Not .EOF
xParent = .Fields("childOf")
Set xNode = trV.Nodes.Add(xParent, tvwChild, .Fields("nodeId"), .Fields("nodeText"), 1)
.MoveNext
Loop
End If

در واقع برای اینکه گره هام رو تو نمودار set کنم باید مقادیر id گره پدر ، نوع وابستگی (که یه مقدار ثابت هست و نیاز نیست از جایی خونده بشه) ، کلید یا id گره فرزند یا گره جاری ، نام گره جاری (name) و در آخر آیکونی که میخواهیم برای اون گره در نظر گرفته بشه
توسط یک حلقه این مقادیر یک به یک در گرها set میشه:
Do While Not .EOF
xParent = .Fields("childOf")
Set xNode = trV.Nodes.Add(xParent, tvwChild, .Fields("nodeId"), .Fields("nodeText"), 1)
.MoveNext
Loop
کلید یا id گره پدر :
.Fields("childOf")
نوع وابستگی (مقدار ثابت) : tvwChild
کلید یا id گره جاری :
.Fields("nodeId")
نام یا caption گره جاری :
.Fields("nodeText")
آیکون گره جاری (که ترجیحاً یه مقدار ثابت در نظر گرفته شده) : 1
اما در کدی که دوستمون لطف کردند گره ها به صورت زیر مقدار دهی میشوند :
While Dr.Read()
Dim T As New TreeNode(Dr(1).ToString)
InsertNode(T, Convert.ToInt32(Dr(0)))
If N Is Nothing Then
TreeView1.Nodes.Add(T)
Else
N.Nodes.Add(T)
End If
End While

که سر در نمیارم چطور تک تک این پارامترها مقدارشون set شده
میشه لطف بفرمائید جهت خوانا تر شدن بهرت کدها (برای متوجه شدن خودم) این کدهای vb.net رو یه جورایی به فرمت نوشته شده در vb6 در بیارید
(xParent = .Fields("childOf")
Set xNode = trV.Nodes.Add(xParent, tvwChild, .Fields("nodeId"), .Fields("nodeText"), 1)
اما در مورد تعیین id گره انتخابی هم یه فورمول وجود داره که این مقدار رو از بدست آوردن max id+1 محاسبه میکنه:
Private Function local_generateNumber() As String
Dim xRs3 As New ADODB.Recordset
Dim sqlQry As String
Dim xNewNum As String
Dim xNum As Long
Dim xZero As Integer
Dim xAddZero As String
sqlQry = ""
sqlQry = "select max(nodeId) as xId from tblNodes"
xRs3.Open sqlQry, xConStr, adOpenDynamic, adLockOptimistic
With xRs3
If IsNull(.Fields("xId")) Then
xNum = 1
Else
xNum = Trim(CLng(Right(.Fields("xId"), 9))) + 1
End If
.Close
End With
xZero = 9 - Len(Trim(xNum))
xAddZero = ""
For x = 1 To xZero
xAddZero = xAddZero & "0"
Next
xNewNum = "a" & xAddZero & xNum
local_generateNumber = xNewNum
End Function
اما مهمترین بخش کار که مربوط به وارد کردن اطلاعات گره ها در بانک میشه (نام گرهی را که میخواهیم در دیتابیس ثبت بشه در textbox ای به اسم txtnode وارد میشه)
Private Sub local_saveNode()
Dim sqlQry As String
Dim xLevel As Integer
Dim xNodeId As String
Dim xRsTemp2 As New ADODB.Recordset
Dim xChildOf As String
Dim xNewNodeText As String
If Trim(txtNode.Text) = "" Then
MsgBox "Enter Text"
txtNode.SetFocus
Exit Sub
End If
sqlQry = ""
xChildOf = ""
xNewNodeText = txtNode.Text
xNodeId = local_generateNumber
If Trim(xSelNodeId) = "a" Then
xLevel = 1
xChildOf = xSelNodeId
Else
sqlQry = "select * from tblNodes where nodeId = '" & xSelNodeId & "'"
xRsTemp2.Open sqlQry, xConStr, adOpenDynamic, adLockOptimistic
With xRsTemp2
xLevel = .Fields("nodeLevel") + 1
xChildOf = xSelNodeId
xRsTemp2.Close
End With
End If
sqlQry = ""
sqlQry = "insert into tblNodes (nodeId, nodeText, nodeLevel, childOf) values " & _
"('" & xNodeId & "', '" & xNewNodeText & "'," & xLevel & ", '" & xChildOf & "')"
xCn.Open xConStr
xCn.Execute (sqlQry)
Set xRsTemp2 = Nothing
xCn.Close
' RunTime کدهاي بالا مربوط ميشه به وارد نمودن اطلاعات گره در ديتابيس و کدهاي پايين مربوط ميشه به ايجاد گره به صورت
Me.trV.Nodes.Add trV.SelectedItem.Key, tvwChild, xNodeId, txtNode.Text
End Sub
این کدها تمام حداقل کد های لازم برای ایجاد یک نمودار شاخه درخت متصل به بانک است
ممنون میشم از شما اساتید محترم که کمکم کنید این کدها رو با اصول و تکنیکهای دیتابیسی موجود در vb.net سازگار کنم
ممنون و متشکر
یاعلی

ircast
دوشنبه 08 فروردین 1390, 18:56 عصر
این کد رو می تونید به این شکل هم استفاده کنید

While Dr.Read()
Dim T As New TreeNode(Dr("NodeText").ToString)
InsertNode(T, Convert.ToInt32(Dr("Id")))
If N Is Nothing Then
TreeView1.Nodes.Add(T)
Else
N.Nodes.Add(T)
End If
End While

ali190
دوشنبه 08 فروردین 1390, 19:19 عصر
سلام
میشه بیشتر توضیح بدین
در کد زیر :
While Dr.Read()
Dim T As New TreeNode(Dr("NodeText").ToString)
InsertNode(T, Convert.ToInt32(Dr("Id")))
If N Is Nothing Then
TreeView1.Nodes.Add(T)
Else
N.Nodes.Add(T)
End If
End While
چطور میتونم کلید گره جاری و آیکون انتخابیش رو (طبق توضیحاتم در پست 5) ست کنم؟
تو این کد انگار در ظاهر فقط کلید گره پدر و تکست SET میشه
نمیشه این کد رو به فرم زیر نوشت (برای فهم بهتر)

Do While Not .EOF
xParent = .Fields("childOf")
Set xNode = trV.Nodes.Add(xParent, tvwChild, .Fields("nodeId"), .Fields("nodeText"), 1)
.MoveNext
Loop

ممنون و متشکر
یاعلی

ircast
دوشنبه 08 فروردین 1390, 19:30 عصر
[QUOTE=ali190;1236625]سلام
میشه بیشتر توضیح بدین
در کد زیر :
While Dr.Read()
Dim T As New TreeNode(Dr("NodeText").ToString)
InsertNode(T, Convert.ToInt32(Dr("Id")))
If N Is Nothing Then
TreeView1.Nodes.Add(T)
Else
N.Nodes.Add(T)
End If
End While

همون طور که خدمتتون عرض کردم من اصلا VB6 کار نکردم

کد فوق میاد زیر گره های هر گره رو توی یک TreeNode ذخیره می کنه و بعد اون رو به گره مورد نظر اضافه میکنه

به شکل تابع بازگشتی عمل میکنه همون طوری که میبینید در خط 3 از خود تابع استفاده شده

ali190
دوشنبه 08 فروردین 1390, 19:35 عصر
ممنون از توضیحاتتون
ولی من چطور میتونم با این روش آیکون گره جاری (که در تعریف یک گره یکی از پرامترهای ورودی است) رو SET کنم؟
ممنو ن و متشکر از لطف شما
یاعلی