TreeView控件显示效果如下所示:-Node_root
-Node1
-Node1-1
-Node1-2
-Node1-2-1
-Node2
-Node3
-Node3-1
-Node3-2怎样做到与TreeView控件数据库相结合自由定制结点数目问题一:数据库表结构如何设置?
问题二:如何用代码将TreeView控件的结点保存到数据库中?
问题三:如何用代码将数据库中定义的结点读出,由TreeView控件显示出来?关于这个问题我以前提过,网友们也很热心,
有的提出用XML文件,但这种方法不适合网络版程序,原因就是更改结点结构后必须把XML文件分发给各个客户端.
也有的给出过数据库结构和读写方法,但是给出的数据库结构不全,而且解释的也不清楚,我看得糊涂请热心的网友帮忙吧.
请给出完整的数据库表结构及简要说明,并给出示例代码.
如果谁给出的答案完整的话,保证给分!!!!
-Node1
-Node1-1
-Node1-2
-Node1-2-1
-Node2
-Node3
-Node3-1
-Node3-2怎样做到与TreeView控件数据库相结合自由定制结点数目问题一:数据库表结构如何设置?
问题二:如何用代码将TreeView控件的结点保存到数据库中?
问题三:如何用代码将数据库中定义的结点读出,由TreeView控件显示出来?关于这个问题我以前提过,网友们也很热心,
有的提出用XML文件,但这种方法不适合网络版程序,原因就是更改结点结构后必须把XML文件分发给各个客户端.
也有的给出过数据库结构和读写方法,但是给出的数据库结构不全,而且解释的也不清楚,我看得糊涂请热心的网友帮忙吧.
请给出完整的数据库表结构及简要说明,并给出示例代码.
如果谁给出的答案完整的话,保证给分!!!!
NAME: 名称
PARENTCODE: 父代码
Dim Rs As ADODB.RecordsetPrivate Sub Command1_Click()
TreeView1.Nodes.Clear
AddTree
End Sub'工程--->引用--->Microsoft ActiveX Data Object 2.x(版本号)
Private Sub Form_Load()
On Error GoTo Errhandle
Set Rs = New ADODB.Recordset
Set CN = New ADODB.Connection
'连接数据库
CN.ConnectionString = "DBQ=" & App.Path & "\db1.mdb;DefaultDir=" & _
App.Path & ";Driver={Microsoft Access Driver (*.mdb)};" & _
"DriverId=25;FIL=MS Access;ImplicitCommitSync=Yes;" & _
"MaxBufferSize=512;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;" & _
"Threads=3;UID=ADMIN;UserCommitSync=Yes;PWD=admind1234;"
CN.Open
Exit Sub
Errhandle:
MsgBox Err.Description, vbExclamation
End SubPrivate Sub AddTree()
'打开记录集,得到深度小于些深度的所有节点,并按深度排序
Rs.Open "select * from tbTree", CN, adOpenDynamic, adLockReadOnly
Dim Xnod As Node
Do While Not Rs.EOF
If Rs.Fields("parentid") = 0 Then
'加入根结点
Set Xnod = TreeView1.Nodes.Add(, , "key" & Rs.Fields("id"), Rs.Fields("context"))
Else
'加入子节点
Set Xnod = TreeView1.Nodes.Add("key" & Rs.Fields("parentid"), tvwChild, "key" & Rs.Fields("id"), Rs.Fields("context"))
End If
Xnod.EnsureVisible
Rs.MoveNext
Loop
Rs.Close
End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
On Error Resume Next
Rs.Close
Set Rs = Nothing
CN.Close
Set CN = Nothing
End Sub这是用的ACCESS数据库,数据库结构为:ID, CONTEXT, PARENTID
难的是当数据库中的某个记录被删除,而其下层的记录没有被删除,这就会造成错误.上面形成的数据库结构应该像下面所示:
-- node0(id:1,parentid=0)
--node1(id:1,parentid=1) --node2(id:2,parentid=1) --node2-1(id:5,parentid=2) --node2-1-1(id:7,parentid=5) --node3(id:3,parentid=1) --node3-1(id=8,parentid=3) --node3-1-1(id=9,praentid=8)
问题是如何删除node2节点及其下层节点在数据库中的记录?可以这样删除node2-1:
DELETE FROM tbTree WHERE id=2
DELETE FROM tbTree WHERE parentid=2但无法删除node2-1-1,因为它的parentid=5难道要将上面的删除子节点的SQL语句改成这样?
DELETE FROM tbTree WHERE parentid>=2
肯定不行,这样会把node3的子节点全部删除因为他们的parentid全>=2如何解决这个问题?
Dim strTmp() As String, i As Long
Dim strSQL As String, strWhere As String
strWhere = Replace(GetNode(TreeView1.SelectedItem), "key", "")
strTmp = Split(strWhere, ",")
strSQL = "DELETE FROM TABLENAME " & IIf(UBound(strTmp) > 0, " WHERE ", "")
For i = 0 To UBound(strTmp) - 1
strSQL = strSQL & "ID = '" & strTmp(i) & "' OR "
Next
strSQL = Left(strSQL, Len(strSQL) - 3)
MsgBox strSQL
Erase strTmp
End SubPrivate Function GetNode(nd As Node) As String
Dim sWhere As String
Dim hSubItem As Node, hSublingItem As Node
Set hSubItem = nd.Child
While Not hSubItem Is Nothing
sWhere = sWhere & hSubItem.Key & ","
Set hSublingItem = hSubItem.Child
While Not hSublingItem Is Nothing
sWhere = sWhere & hSublingItem.Key & ","
Set hSublingItem = hSublingItem.Next
Wend
Set hSubItem = hSubItem.Next
Wend
GetNode = sWhere
End Function