TreeView控件显示效果如下所示:-Node_root
      -Node1
           -Node1-1
           -Node1-2
                 -Node1-2-1
      -Node2
      -Node3
           -Node3-1
           -Node3-2怎样做到与TreeView控件数据库相结合自由定制结点数目问题一:数据库表结构如何设置?
问题二:如何用代码将TreeView控件的结点保存到数据库中?
问题三:如何用代码将数据库中定义的结点读出,由TreeView控件显示出来?关于这个问题我以前提过,网友们也很热心,
有的提出用XML文件,但这种方法不适合网络版程序,原因就是更改结点结构后必须把XML文件分发给各个客户端.
也有的给出过数据库结构和读写方法,但是给出的数据库结构不全,而且解释的也不清楚,我看得糊涂请热心的网友帮忙吧.
请给出完整的数据库表结构及简要说明,并给出示例代码.
如果谁给出的答案完整的话,保证给分!!!!

解决方案 »

  1.   

    http://www.microsoft.com/china/community/Column/21.mspx
      

  2.   

    表结构:CODE: 代码
    NAME: 名称
    PARENTCODE: 父代码
      

  3.   

    请问,如何在www.microsoft.com上查找自己想要的技术信息?
      

  4.   

    http://www.microsoft.com/china/msdn/archives/catalog/default.asp
      

  5.   

    Option ExplicitDim CN As ADODB.Connection                '定义数据库的连接
    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
      

  6.   

    上面的网友给出的代码很容易理解,从数据库中循环出数据加载到TREEVIEW中不难.
    难的是当数据库中的某个记录被删除,而其下层的记录没有被删除,这就会造成错误.上面形成的数据库结构应该像下面所示:
       -- 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如何解决这个问题?
      

  7.   

    TO: trendvb(Aaron) 只要遍历所要删除的结点,取得其所有子结点的KEY,构造SQL语句就可以了,代码如下:Private Sub Command2_Click()
        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