我的做法:把要加载的数据存到一个数据表中(格式:ID,Text,ParentID) ,利用算法动态加载treeview

解决方案 »

  1.   

    呵呵,简单
    我有个例子,先将数据库数据转换成XML,然后加到树上,这是我的几个函数!
        Public Function WriteXmlByDatabase(ByVal MyConnSB As OleDb.OleDbConnection) As String
            Dim strXml As String
            If dtTempTable.Columns.Count < 1 Then CreateTempTables()
            dtTempTable.Clear()
            Dim cmd As New OleDbCommand()
            Dim rd As OleDbDataReader
            Dim myDataRow As DataRow
            If Not ConnectDb(MyConnSB) Then Exit Function
            cmd.Connection = MyConnSB
            cmd.CommandText = " select LDM,LMC,FLDM from WZ_SBL where SCBJ<>'1'" & _
                              " and substr(XZJGDM,1,8)='" + Mid(GetUnitNoByUserId(MyConnSB, GetLoginUserId), 1, 8) + "' order by LDM "
            Try
                rd = cmd.ExecuteReader
            Catch ex As Exception
                MessageBox.Show(ex.Message)
                Exit Function
            End Try
            While rd.Read
                myDataRow = dtTempTable.NewRow()
                If Not rd.IsDBNull(0) Then
                    myDataRow("ClassNo") = rd.GetValue(0)
                Else
                    myDataRow("ClassNo") = ""
                End If
                If Not rd.IsDBNull(1) Then
                    myDataRow("ClassName") = Trim(rd.GetValue(1))
                Else
                    myDataRow("ClassName") = ""
                End If
                If Not rd.IsDBNull(2) Then
                    myDataRow("ParentClassNo") = rd.GetValue(2)
                Else
                    myDataRow("ParentClassNo") = ""
                End If
                dtTempTable.Rows.Add(myDataRow)
            End While
            rd.Close()        '写XML
            '先找出根节点------父类代码为0或空的
            Dim i As Integer
            Dim strAllXml As String
            For i = 0 To dtTempTable.Rows.Count - 1
                If Trim(dtTempTable.Rows(i)("ParentClassNo")) = "" Or Trim(dtTempTable.Rows(i)("ParentClassNo")) = "0" Then
                    strXml = "<Node text='" + Trim(dtTempTable.Rows(i)("ClassName")) + "' tag='" + Trim(dtTempTable.Rows(i)("ClassNo")) + "'>"
                    strXml = strXml + WriteXml(Trim(dtTempTable.Rows(i)("ClassNo")))
                    strXml = strXml + "</Node>"
                    strAllXml = strAllXml + strXml
                End If
            Next
            WriteXmlByDatabase = strAllXml
        End Function
        Private Function WriteXml(ByVal strParsentClassNo As String) As String
            Dim i As Integer
            Dim strXml As String
            For i = 0 To dtTempTable.Rows.Count - 1
                If Trim(dtTempTable.Rows(i)("ParentClassNo")) = Trim(strParsentClassNo) Then
                    strXml = "<Node text='" + Trim(dtTempTable.Rows(i)("ClassName")) + "' tag='" + Trim(dtTempTable.Rows(i)("ClassNo")) + "'>"
                    strXml = strXml + WriteXml(Trim(dtTempTable.Rows(i)("ClassNo")))
                    strXml = strXml + "</Node>"
                    WriteXml = WriteXml + strXml
                End If
            Next
        End Function    Public Sub WriteTreeNode(ByVal nodeTree As TreeNode, ByVal nodeXml As XmlNode)
            Dim treenode As TreeNode
            Dim xmlnode As XmlNode
            Dim i As Integer
            Dim aa As New TreeNode()
            aa.Tag = nodeXml.Attributes("tag").Value
            aa.Text = nodeXml.Attributes("text").Value
            nodeTree.Nodes.Add(aa)
            If nodeXml.HasChildNodes Then
                For i = 0 To nodeXml.ChildNodes.Count - 1
                    WriteTreeNode(aa, nodeXml.ChildNodes(i))
                Next
            End If
        End Sub    Public Function GetAllChilderNodeTag(ByVal xndTreeNode As TreeNode) As String
            Dim i As Integer
            Dim strTmp As String
            If xndTreeNode Is Nothing Then Exit Function
            If Trim(xndTreeNode.Tag) <> "" Then strTmp = strTmp + Trim(xndTreeNode.Tag) + ","
            For i = 0 To xndTreeNode.GetNodeCount(False) - 1
                strTmp = strTmp + GetAllChilderNodeTag(xndTreeNode.Nodes(i))
            Next
            GetAllChilderNodeTag = strTmp
        End Function
    /*************************
            strTreeXml = "<?xml version='1.0' encoding='gb2312' ?><RootNode>" + strTreeXml + "</RootNode>"
            LoadTree(strTreeXml)
    /************************
        Private Sub LoadTree(ByVal strXml As String)
            Dim doc As New XmlDocument()
            Dim node As XmlNode
            doc.LoadXml(strXml)
            node = doc.SelectSingleNode("RootNode")
            TreeView1.Nodes.Clear()
            Dim i As Integer
            Dim aa As TreeNode
            aa = TreeView1.Nodes.Add("所有设备类")
            For i = 0 To node.ChildNodes.Count - 1
                WriteTreeNode(aa, node.ChildNodes(i))
            Next
            TreeView1.ExpandAll()
        End Sub
      

  2.   

    select LDM,LMC,FLDM from WZ_SBL 中的LDM,LMC,FLDM 和你的ID,Text,ParentID是一样的意思!
      

  3.   

    to czy412(我想飞!但我没翅膀,唉!)   有没有 C# 版的,VB我不会
      

  4.   


      to czy412   dtTempTable 是什么类型?
      

  5.   

    root
      |---10
          |---1001
          |---1002
          20
          |---2001
              |---200101
              |---200102 
    TreeNode root = new TreeNode(); root.Text = "root";
    TreeNode n10 = new TreeNode("10"); root.Nodes.Add(n10);
    TreeNode n1001 = new TreeNode("1001"); n10.Nodes.Add(n1001);
    TreeNode n1002 = new TreeNode("1002"); n10.Nodes.Add(n1002);
    TreeNode n20 = new TreeNode("20"); root.Nodes.Add(n20);
    TreeNode n2001 = new TreeNode("2001"); n20.Nodes.Add(n2001);
    TreeNode n200101 = new TreeNode("200101"); n20.Nodes.Add(n200101);
    TreeNode n200102 = new TreeNode("200102"); n20.Nodes.Add(n200102);
    TreeView實例.Nodes.Add(root);
      

  6.   

    呵呵,C#不懂吗?都差不多的呀!
    dtTempTable 是个我定义的dataTables
      

  7.   

    public void LoadTreeNode(TreeNode node,System.Xml.XmlNode xmlNode)
    {
    if(xmlNode.Attributes["text"]!=null)
    node.Text=xmlNode.Attributes["text"].Value;
    else
    node.Text=xmlNode.Name;
    if(!xmlNode.HasChildNodes) return;
    for(int i=0;i<xmlNode.ChildNodes.Count;i++)
    {
    TreeNode childNode=new TreeNode();
    LoadTreeNode(childNode,xmlNode.ChildNodes[i]);
    node.Nodes.Add(childNode);
    }
    }
    public void LoadTree(TreeView treeView,string xmlStr)
    {
    System.Xml.XmlDocument xmlDocument=new System.Xml.XmlDocument();
    xmlDocument.LoadXml(xmlStr);
    System.Xml.XmlNode xmlNode=xmlDocument.SelectSingleNode("TreeNodes");
    TreeNode rootNode=new TreeNode();
    LoadTreeNode(rootNode,xmlNode);
    for(int i=0;i<rootNode.Nodes.Count;i++)
    treeView.Nodes.Add(rootNode.Nodes[i]);
    }
    public Form1()
    {
    string xmlStr="<?xml version='1.0' encoding='gb2312' ?>"+
    "<TreeNodes>"+
    "<root>"+
    "<node1 text=\"10\">"+
    "<node2 text=\"1001\"/>"+
    "<node3 text=\"1002\"/>"+
    "</node1>"+
    "<node4 text=\"20\">"+
    "<node5 text=\"2001\">"+
    "<node6 text=\"200101\"/>"+
    "<node7 text=\"200102\"/>"+
    "</node5>"+
    "</node4>"+
    "</root>"+
    "</TreeNodes>"; this.LoadTree(this.treeView1,xmlStr);
    }