回 帖 发 新 帖 刷新版面

主题:有关于TreeView的问题

到目前为止,我一直在逃避这个事实,做程序的时候一直避免使用到TreeView。[em8]
希望各位朋友能够给些指点。

到目前为止,我只能写出界面上的代码,无法添加到后台数据库中去,如下:
这个是想做一个部门级别的树

Private Sub CmdNewDepa_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdNewDepa.Click
        Dim _node As TreeNode
        If Not Me.txtDepa.Text.Trim.Equals("") Then
            _node = New TreeNode(Me.txtDepa.Text.Trim)
            Me.TreeView1.Nodes.Add(_node)
        End If
        txtDepa.Text = ""
    End Sub

    Private Sub CmdNewDepaChild_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdNewDepaChild.Click
        Dim _node As TreeNode
        If Not Me.txtChildDepa.Text.Trim.Equals("") Then
            If Not Me.TreeView1.SelectedNode Is Nothing Then
                Me.TreeView1.SelectedNode.Nodes.Add(Me.txtChildDepa.Text.Trim)
            Else
                Me.TreeView1.Nodes.Add(Me.txtChildDepa.Text.Trim)
            End If
        End If
        txtChildDepa.Text = ""
    End Sub

我希望能够动态添加到数据库中去,怎么弄??
另外,数据库的结构应该是怎么样的,
一级部门     二级部门    三级部门
a            b           c
a            b           d

还是应该
一级部门     二级部门    三级部门
a            b           c
Null         Null        d


或者说还有其他的结构,请大家指教

回复列表 (共12个回复)

沙发

要下班了,自己顶起……

板凳

继续up~~~~~~~~
快来人哈!!!!!!!!!!!!!!!!!!!!

3 楼

宝宝我做了一个..哈哈...希望能帮到你..但是你帮我看看那个逻辑性的错误的那贴子啊...

我实在不知道怎么改了...帮帮啦....别拒绝噢......

我在他本身的属性里面添加了根结点和两个子结点..
ComboBox1.Items.Add("普通用户")
        ComboBox1.Items.Add("超级用户")

        Dim i As Integer
        Dim MyNode As String

        TreeView1.ExpandAll()'展开树
        MyDataSet.Clear()
        MyODA.TableMappings.Clear()
        Selstr = "select * from users"
        Call 联接数据库.LDB()'这是一个联数据库的函数
        For i = 0 To MyDataSet.Tables("user").Rows.Count - 1
            If MyDataSet.Tables("user").Rows.Count = 0 Then
                Exit Sub
            Else

                MyNode = MyDataSet.Tables("User").Rows(i)("帐号").ToString

                Select Case MyDataSet.Tables("User").Rows(i)("权限").ToString
                    Case "普通用户"
                        TreeView1.TopNode.NextVisibleNode.Nodes.Add(MyNode)
                        TreeView1.ExpandAll()

                    Case "超级用户"
                        TreeView1.TopNode.LastNode.Nodes.Add(MyNode)
                        TreeView1.ExpandAll()
                    Case Else
                        Exit For
                        Exit Select
                        Exit Sub
                End Select

            End If
        Next
        Myconn.Close()
    End Sub



如果你要选择那一个结点的话..你就用selectNode这个东西..不晓得我打错没有..这东西不全面..还是有点死..因为我是在他本身属性里面添进去的..但是下面的内容是数据库里面的...

4 楼

谢谢哈,还是你够义气,55,感动ing~~~~~
你说的我明白了。
另外的问题,就是你的那个数据库里的结构是怎么样的??看我一开始的帖

5 楼

Dim Item, Item1 As String
        Dim classin As New ClassInfo
        classin = GetClass(0)
        Dim classin1 As New ClassInfo

        Dim i, j As Integer

        For j = 0 To classin.count - 1 '用for循环来把学生信息全部显示出来
            classin = GetClass(j) '获取每行信息
            Item = classin.nianji
            classin1 = GetClass1(0, Item)
            NewNode = TreeView1.Nodes.Add(Item)
            NewNode.ImageIndex = 5 '折叠时显示的图标
            ' NewNode.SelectedImageIndex = 5 '展开时显示的涂标
            For i = 0 To classin1.count - 1
                classin1 = GetClass1(i, Item) '获取每行信息
                Item1 = classin1.banji
                NewNode1 = NewNode.Nodes.Add(Item1)
                NewNode1.ImageIndex = 4 '折叠时显示的图标

            Next i
            TreeView1.Select()
        Next j
        TreeView1.Select()

6 楼

数据库表的结构如下
最简单的是只需要一个节点表,保存每个节点的名称和分类
CREATE TABLE [dbo].[Nodes] (
    [NodeID] [int] IDENTITY (1, 1) NOT NULL ,
    [NodeName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [NodeClass] [int] NOT NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Nodes] ADD
    CONSTRAINT [PK_Nodes] PRIMARY KEY  CLUSTERED
    (
        [NodeID]
    )  ON [PRIMARY]
GO

这里默认NodeClass为0的时候就是在根节点下面的点

同时手动录入一些测试数据
NodeID       NodeName      NodeClass
   1         财政部门       0
   2         人力资源       0
   3         开发部门       0
   4         会计办公室     1
   5         企业文化宣传科 2
   6         项目组         3
   7         产品组         3
   8         外包组         3

7 楼

假定treeview1就是你界面上的树控件,它必须有一个根节点(可视化建立)
使用下面这段代码进行遍历,就可以即时从数据库中组织树结构并显示了
        /// <summary>
        /// 遍历并建立树控件
        /// </summary>
        /// <param name="nodeID">树结点的ID,0代表根</param>
        /// <param name="tn">要增加孩子的节点,第一次给TreeView1.Nodes[0]就可以了</param>
        public void BuildTree(int nodeID,TreeNode tn)
        {
            //这句是伪代码,获得sql语句指定的数据集合
            DataTable dt = GetTable("获得nodeID指定的节点下面的所有节点,select * from Nodes where NodeClass = nodeID");
            foreach(DataRow dr in dt.Rows)
            {
                TreeNode tmpnode = new TreeNode(dr["NodeName"].ToString());
                tn.Nodes.Add(tmpnode);
                //递归自己
                BuildTree(Convert.ToInt32(dr["NodeID"]),tmpnode);
            }
        }

8 楼

谢谢,我琢磨下先~~
你是知道我是看见花括号就想撞墙的人,呵呵[em4]

9 楼

宝宝啊呜 这是正中vb.net代码,希望对你有帮助
     Dim sqlstr As String
     sqlstr = "Server=(……);Database=……;uid=……;pwd=……"

      '在treeView  中添加节点
       Dim qzNode As New TreeNode
        qzNode.Text = "部门一"
        qzNode.ImageIndex = 0
        TreeView1.Nodes(0).Nodes.Add(qzNode)

        Dim nnNode As New TreeNode
        nnNode.Text = "部门二"
        nnNode.ImageIndex = 0
        TreeView1.Nodes(0).Nodes.Add(nnNode)
        …………部门三
        …………部门四


下面为从SQL中导入各部门的子节点,SQL中的一个表的数据就表示一个部门的子节点
Dim ConnsqlQZ As New SqlConnection(sqlstr)
ConnsqlQZ.Open()
Dim biaoQZ As New SqlCommand("select * from ……")
biaoQZ.Connection = ConnsqlQZ
Dim myReaderqz As SqlDataReader 'SqlDataReader
myReaderqz = biaoQZ.ExecuteReader(CommandBehavior.CloseConnection)
Do While myReaderqz.Read  
            Dim mySubNode As New TreeNode
            mySubNode.Text = myReaderqz.Item("catName")               
            qzNode.Nodes.Add(mySubNode)   
Loop


同样历遍导入部门二、部门三

10 楼

我现在数据库的结构是这样子的

父结点      子结点
-------------------
无            1
无            2
1             123
123           1234
2             22

在TreeView中要显示的效果是

1
  -----123
          ------1234

2
  -----22


应该怎么读出来,我郁闷到现在了,递归出来的数据一塌糊涂……

拜托大家写出详细的代码吧,555555,先谢谢了~~~~~~~~~~~

我来回复

您尚未登录,请登录后再回复。点此登录或注册