把数据库表填充到Treeview控件的问题,请各位高手帮帮忙 十分感谢了.

时间:2021-04-05 20:44:39
数据库表:GoodsSortInfo   字段:类别名称,上级类别,计量单位,编号,节点级别
                            例: 家用电器  无       台      00001  1
                             电视机   家用电器  台     00002  2
我想把数据库中的数据加载到Treeview控件中,并按照他们的级别树状显示.下面是我自己写的代码:
Imports System.Data.OleDb
Public Class FrmGoodsSort
    Dim Connstr As String = _
   "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\jxc.mdb"
   Sub FillTreeview()
        Dim sqlstr As String = "Select * From GoodsSortInfo"  '查询到表数据
        Dim conn As OleDbConnection = New OleDbConnection(Connstr)
        Dim mycommand As New OleDbCommand(sqlstr, conn)
        Dim Table As DataTable = EditData.Search(Connstr, sqlstr)  '(EditData是我做的一个类.数据库操作用)
        Dim sqlrd As OleDbDataReader
        Dim ii As Integer
        conn.Open()
        sqlrd = mycommand.ExecuteReader
        While sqlrd.Read
            Dim Node As New TreeNode
            If sqlrd.Item(4) = 1 Then   '判断第一节点的名称,添加到树状控件中.
                Node.Tag = sqlrd.Item(3)  
                Node.Text = sqlrd.Item(0)
                TreeView1.Nodes(0).Nodes.Add(Node)
            End If
            Dim i As Integer
            For i = 0 To (Table.Rows.Count - 1)   
                If sqlrd.Item(4) = 2 And sqlrd.Item(1) = Table.Rows(i).Item(0) Then '(判断2级节点上的名称,并且循环判断他们按照分类添加到各自的上级目录中,作为子结点.这段代码有点繁琐,我也不知道自己怎么想出来的)
                    Node.Tag = sqlrd.Item(3)
                    Node.Text = sqlrd.Item(0)
                     TreeView1.Nodes(0).Nodes(i).Nodes.Add(Node)   '(按照对应的节点名进行添加)
                End If
            Next
        End While
        conn.Close()
    End Sub
.现在只有做到2个节点,因为出现问题.如果一次性编辑好数据库ACCESS里面的表数据.可以运行,并且分级显示数据不会报错.
但是,你现在停止运行,然后打开数据库,增加一个1级节点的数据,在往1级节点上增加一个2级节点,在运行程序的时候,他就会报错.
比如:现在添加一个1级节点.在数据库中添加  食品.   在添加一个食品的子节点. 火腿肠,节点级别 是2.  现在运行程序,立刻就会出现错误.
TreeView1.Nodes(0).Nodes(i).Nodes.Add(Node)  代码处出现:指定的参数已超出有效值的范围。参数名: index
为什么会这样,请各位高手指教啊.我是菜鸟啊...没有任何资料.这个控件我弄了2个星期多了.也看了很多人写的关于这个控件的用法,但是总觉得都不好用...我只想把数据库中的数据 按照级别,动态的填充到树状控件中.. 请各位高手帮忙啊...希望找一个老师或者朋友能够指点一下我. 感激不尽.....我分不多, 如果可以帮组我的话,我可以送QB啊 送其他的都可以的.  谢谢了....等待好心人的出现......一个坚强菜鸟的呼救....第一次发帖求救....

19 个解决方案

#1


高手们快点来啊      找个师傅....谁能帮帮小弟啊        我学得好辛苦啊    

#2


救命啊......谁来救救我啊  大哥们......师傅们.....找个师傅啊....谁着着我师傅啊     拜托了   

#3


你代码写的太凌乱了,建议你将SQL语句查询到的数据填充到DataTable中,然后再循环给TreeView赋值,应该不会出错的

#4


你说的是     Dim TempRow as DataRow 
            然后在   For Each Temprow In Table.Rows
        这样吗??  这样很麻烦啊  而且要实现动态的 树状也好麻烦  我开始就是用的这样的方法/

#5


我QQ 335367013   Email 335367013@qq.com 电话 13710378614  谁能帮帮我 谢谢了...等待中.....

#6


你是想实现如下结构吗?
集团
   --子公司
          ---部门
               --车间
                  ---班组
你的数据表结构应该变更一下

编号   名称      是否*   级别  父级编号
101  家用电器    True      0      0
102  电视机      False     1      101

做个递归吧!

#7


你好  我想实现的是
—所有类别0
        -1家用电器
                -2电视机
                -2洗衣机
                -2电冰箱
        -1化妆品
               -2口红
               -2眼影
               -2唇彩
        -1食品类
               -2火腿肠
               -2鸡蛋
               -2奶粉

我想要的是这样的效果。而且是动态加载的。。。现在这个代码可以加载显示数据库的库存,并分好类。但是现在不能往数据库里面添加1级节点的数据,一添加就出错。比如现在我添加一个药品1.感冒药2.。。就出错了
—所有类别0
        -1家用电器
                -2电视机
                -2洗衣机
                -2电冰箱
        -1化妆品
               -2口红
               -2眼影
               -2唇彩
        -1食品类
               -2火腿肠
               -2鸡蛋
               -2奶粉
        -药品
               -2感冒药

如果现在添加一个药品和感冒药,他就会出错,如果是数据库一次性把数据输入完毕的话,他不会出现错误。请高手们帮忙解决 。。。。谢谢了   等待中。。。。。。。。。。。。。。

#8


出现错误,请帖出异常的说明。

#9


 如果现在添加一个药品和感冒药,他就会出错 TreeView1.Nodes(0).Nodes(i).Nodes.Add(node)   指定的参数已超出有效值的范围。
参数名: index
它提示这个错误。 我把程序关闭,重庆启动程序的时候它应该会重新引索数据库啊。我就想不明白这点

#10


这个问题很明显是由于
Nodes(0)或者Nodes(i)不存在引起的。
你要在添加之前做检查:
if(TreeView1.Nodes.Count>0 && TreeView1.Nodes[0].Nodes.Count>i)
{
   TreeView1.Nodes[0].Nodes[i].Nodes.Add(node);
}

#11


郁闷了。。。看来是没有高手愿意来回答了。。。等了一天多了   如有高手愿意帮忙请加我QQ 335367013 感激不尽

#12


引用 10 楼 phy 的回复:
这个问题很明显是由于 
Nodes(0)或者Nodes(i)不存在引起的。 
你要在添加之前做检查: 
if(TreeView1.Nodes.Count>0 && TreeView1.Nodes[0].Nodes.Count>i) 

  TreeView1.Nodes[0].Nodes[i].Nodes.Add(node); 
}


phy 大哥 您好 非常感谢你的指点。Nodes(0)或者Nodes(i)是存在的,数据库中明明有nodes4个节点。但是只能加载3个出来。 我在这样的方法动态填充Treeview控件可以吗? 您有更好的方法和方案动态的填充Treeview控件吗? 请指引。。我是个菜鸟。需要您的帮助 我用的是vb20005  VB

#13



Private Sub treelist()
        TreeView1.Nodes.Clear()
        sqlread("select * from 新菜单设置 where 上级菜单=0 order by 排序 asc", "主菜")
        For i As Integer = 0 To EchoDS.Tables("主菜").Rows.Count - 1
            TreeView1.Nodes.Add(EchoDS.Tables("主菜").Rows(i).Item("id"), EchoDS.Tables("主菜").Rows(i).Item("菜单名称"))
            sqlread("select* from 新菜单设置 where 上级菜单=" & _
            EchoDS.Tables("主菜").Rows(i).Item("id") & " order by 排序 asc", "子菜")
            Dim pic As String
            For j As Integer = 0 To EchoDS.Tables("子菜").Rows.Count - 1
                If EchoDS.Tables("子菜").Rows(j).Item("image").ToString <> "" And IsDBNull(EchoDS.Tables("子菜").Rows(j).Item("image")) = False Then
                    pic = " [有图标]"
                Else
                    pic = ""
                End If
                TreeView1.Nodes.Item(Mid(EchoDS.Tables("子菜").Rows(j).Item("上级菜单"), 1, 2)) _
                .Nodes.Add(EchoDS.Tables("子菜").Rows(j).Item("id"), _
                EchoDS.Tables("子菜").Rows(j).Item("菜单名称") & " (" & EchoDS.Tables("子菜").Rows(j).Item("指向窗体") & ")" & pic)
                If EchoDS.Tables("子菜").Rows(j).Item("LINE") = True Then
                    TreeView1.Nodes.Item(Mid(EchoDS.Tables("子菜").Rows(j).Item("上级菜单"), 1, 2)) _
                .Nodes.Add("-----(华丽的分隔线)-----")
                End If
            Next
            EchoDS.Tables("子菜").Reset()
        Next
        EchoDS.Reset()
    End Sub


这样行不?

#14


谢谢您 htpower  大哥,我正在测试,我是菜鸟的,你的代码我要点时间来消化,谢谢你啊  我在测试。结果一会回复你

#15


htpower 大哥 您的代码我还是看不明白,可能是我太菜了。有几点疑惑想和你求教一下。
1:sqlread("select * from 新菜单设置 where 上级菜单=0 order by 排序 asc", "主菜") 中sqlread是 那里来的。是您定义的
Dim sqlread As String = ("select * from 新菜单设置 where 上级菜单=0 order by 排序 asc""主菜")查询数据库语句吗?

2:您写的这段代码是需要几个表。表的结构我弄不出来,

3:最后的那些语句我都不怎么读的通。 TreeView1.Nodes.Item(Mid(echods.Tables("子菜").Rows(j).Item("上级菜单"), 1, 2)) _
                .Nodes.Add(echods.Tables("子菜").Rows(j).Item("id"), _ 这里的1.2 是什么意思了  麻烦您了

#16


你要在添加之前做检查: 
if(TreeView1.Nodes.Count>0 && TreeView1.Nodes[0].Nodes.Count>i) 

  TreeView1.Nodes[0].Nodes[i].Nodes.Add(node); 

#17


补充一下   htpower大哥 你用的是 Microsoft Visual Studio 2005 中的VB开发工具吗?
sqlread("select * from 新菜单设置 where 上级菜单=0 order by 排序 asc", "主菜")
这一句后面的排序那里有问题。这样个格式不对吧。还是我没有弄好?

#18


结贴了 自己已经把问题解决了。。上面的各位,虽然你们给的答案都不好,都是废话,或者说是牛头不对马嘴,但是还是要说声谢谢。
 
  一会在把自己你的代码优化有一下发出来和新人菜鸟一起分享。
动态填充treeview的代码。。

#19


sqlread是我自已写的一个加载到DATASET的FUNCTION

#1


高手们快点来啊      找个师傅....谁能帮帮小弟啊        我学得好辛苦啊    

#2


救命啊......谁来救救我啊  大哥们......师傅们.....找个师傅啊....谁着着我师傅啊     拜托了   

#3


你代码写的太凌乱了,建议你将SQL语句查询到的数据填充到DataTable中,然后再循环给TreeView赋值,应该不会出错的

#4


你说的是     Dim TempRow as DataRow 
            然后在   For Each Temprow In Table.Rows
        这样吗??  这样很麻烦啊  而且要实现动态的 树状也好麻烦  我开始就是用的这样的方法/

#5


我QQ 335367013   Email 335367013@qq.com 电话 13710378614  谁能帮帮我 谢谢了...等待中.....

#6


你是想实现如下结构吗?
集团
   --子公司
          ---部门
               --车间
                  ---班组
你的数据表结构应该变更一下

编号   名称      是否*   级别  父级编号
101  家用电器    True      0      0
102  电视机      False     1      101

做个递归吧!

#7


你好  我想实现的是
—所有类别0
        -1家用电器
                -2电视机
                -2洗衣机
                -2电冰箱
        -1化妆品
               -2口红
               -2眼影
               -2唇彩
        -1食品类
               -2火腿肠
               -2鸡蛋
               -2奶粉

我想要的是这样的效果。而且是动态加载的。。。现在这个代码可以加载显示数据库的库存,并分好类。但是现在不能往数据库里面添加1级节点的数据,一添加就出错。比如现在我添加一个药品1.感冒药2.。。就出错了
—所有类别0
        -1家用电器
                -2电视机
                -2洗衣机
                -2电冰箱
        -1化妆品
               -2口红
               -2眼影
               -2唇彩
        -1食品类
               -2火腿肠
               -2鸡蛋
               -2奶粉
        -药品
               -2感冒药

如果现在添加一个药品和感冒药,他就会出错,如果是数据库一次性把数据输入完毕的话,他不会出现错误。请高手们帮忙解决 。。。。谢谢了   等待中。。。。。。。。。。。。。。

#8


出现错误,请帖出异常的说明。

#9


 如果现在添加一个药品和感冒药,他就会出错 TreeView1.Nodes(0).Nodes(i).Nodes.Add(node)   指定的参数已超出有效值的范围。
参数名: index
它提示这个错误。 我把程序关闭,重庆启动程序的时候它应该会重新引索数据库啊。我就想不明白这点

#10


这个问题很明显是由于
Nodes(0)或者Nodes(i)不存在引起的。
你要在添加之前做检查:
if(TreeView1.Nodes.Count>0 && TreeView1.Nodes[0].Nodes.Count>i)
{
   TreeView1.Nodes[0].Nodes[i].Nodes.Add(node);
}

#11


郁闷了。。。看来是没有高手愿意来回答了。。。等了一天多了   如有高手愿意帮忙请加我QQ 335367013 感激不尽

#12


引用 10 楼 phy 的回复:
这个问题很明显是由于 
Nodes(0)或者Nodes(i)不存在引起的。 
你要在添加之前做检查: 
if(TreeView1.Nodes.Count>0 && TreeView1.Nodes[0].Nodes.Count>i) 

  TreeView1.Nodes[0].Nodes[i].Nodes.Add(node); 
}


phy 大哥 您好 非常感谢你的指点。Nodes(0)或者Nodes(i)是存在的,数据库中明明有nodes4个节点。但是只能加载3个出来。 我在这样的方法动态填充Treeview控件可以吗? 您有更好的方法和方案动态的填充Treeview控件吗? 请指引。。我是个菜鸟。需要您的帮助 我用的是vb20005  VB

#13



Private Sub treelist()
        TreeView1.Nodes.Clear()
        sqlread("select * from 新菜单设置 where 上级菜单=0 order by 排序 asc", "主菜")
        For i As Integer = 0 To EchoDS.Tables("主菜").Rows.Count - 1
            TreeView1.Nodes.Add(EchoDS.Tables("主菜").Rows(i).Item("id"), EchoDS.Tables("主菜").Rows(i).Item("菜单名称"))
            sqlread("select* from 新菜单设置 where 上级菜单=" & _
            EchoDS.Tables("主菜").Rows(i).Item("id") & " order by 排序 asc", "子菜")
            Dim pic As String
            For j As Integer = 0 To EchoDS.Tables("子菜").Rows.Count - 1
                If EchoDS.Tables("子菜").Rows(j).Item("image").ToString <> "" And IsDBNull(EchoDS.Tables("子菜").Rows(j).Item("image")) = False Then
                    pic = " [有图标]"
                Else
                    pic = ""
                End If
                TreeView1.Nodes.Item(Mid(EchoDS.Tables("子菜").Rows(j).Item("上级菜单"), 1, 2)) _
                .Nodes.Add(EchoDS.Tables("子菜").Rows(j).Item("id"), _
                EchoDS.Tables("子菜").Rows(j).Item("菜单名称") & " (" & EchoDS.Tables("子菜").Rows(j).Item("指向窗体") & ")" & pic)
                If EchoDS.Tables("子菜").Rows(j).Item("LINE") = True Then
                    TreeView1.Nodes.Item(Mid(EchoDS.Tables("子菜").Rows(j).Item("上级菜单"), 1, 2)) _
                .Nodes.Add("-----(华丽的分隔线)-----")
                End If
            Next
            EchoDS.Tables("子菜").Reset()
        Next
        EchoDS.Reset()
    End Sub


这样行不?

#14


谢谢您 htpower  大哥,我正在测试,我是菜鸟的,你的代码我要点时间来消化,谢谢你啊  我在测试。结果一会回复你

#15


htpower 大哥 您的代码我还是看不明白,可能是我太菜了。有几点疑惑想和你求教一下。
1:sqlread("select * from 新菜单设置 where 上级菜单=0 order by 排序 asc", "主菜") 中sqlread是 那里来的。是您定义的
Dim sqlread As String = ("select * from 新菜单设置 where 上级菜单=0 order by 排序 asc""主菜")查询数据库语句吗?

2:您写的这段代码是需要几个表。表的结构我弄不出来,

3:最后的那些语句我都不怎么读的通。 TreeView1.Nodes.Item(Mid(echods.Tables("子菜").Rows(j).Item("上级菜单"), 1, 2)) _
                .Nodes.Add(echods.Tables("子菜").Rows(j).Item("id"), _ 这里的1.2 是什么意思了  麻烦您了

#16


你要在添加之前做检查: 
if(TreeView1.Nodes.Count>0 && TreeView1.Nodes[0].Nodes.Count>i) 

  TreeView1.Nodes[0].Nodes[i].Nodes.Add(node); 

#17


补充一下   htpower大哥 你用的是 Microsoft Visual Studio 2005 中的VB开发工具吗?
sqlread("select * from 新菜单设置 where 上级菜单=0 order by 排序 asc", "主菜")
这一句后面的排序那里有问题。这样个格式不对吧。还是我没有弄好?

#18


结贴了 自己已经把问题解决了。。上面的各位,虽然你们给的答案都不好,都是废话,或者说是牛头不对马嘴,但是还是要说声谢谢。
 
  一会在把自己你的代码优化有一下发出来和新人菜鸟一起分享。
动态填充treeview的代码。。

#19


sqlread是我自已写的一个加载到DATASET的FUNCTION

#20