这个是数据结构ModuleID ModuleName ModulePage ModuleParent ModuleOrder
1 字典管理     1 0
2 身份管理 b.aspx 1 1
3 用户管理 3 0
4 新增用户 a.aspx 3 1
ModuleID--模块ID,自动增长
ModuleName--名称
ModulePage--页面
ModuleParent--与ModuleID相对应
ModuleOrder--,如果为0时为根节点,否则为子节点(两级就可以了)
Dim MyDR As SqlDataReader = MyCommand.ExecuteReader()            MyDS.Load(MyDR, LoadOption.OverwriteChanges, New String() {"Module"})
            
            Dim DV As DataView = MyDS.Tables(0).DefaultView            DV.RowFilter = "ModuleOrder=0"            If DV.Count > 0 Then                For i As Integer = 0 To DV.Count - 1                    Dim TV As TreeNode = New TreeNode                    With TV
                        .Text = DV.Item(i).Item("ModuleName")
                        .Value = DV.Item(i).Item("ModuleID")
                        .Expanded = False
                    End With                    
                    TreeView1.Nodes.Add(TV)                    Dim DVP As DataView = MyDS.Tables(0).DefaultView                    DVP.RowFilter = "ModuleOrder<>0 AND ModuleParent=" & _
                    DV.Item(i).Item("ModuleID").ToString()                    If DVP.Count > 0 Then                        For j As Integer = 0 To DVP.Count - 1                            Dim TVP As TreeNode = New TreeNode                            With TVP
                                .Text = DVP.Item(j).Item("ModuleName")
                                .Value = DVP.Item(j).Item("ModuleParent")
                                .NavigateUrl = DVP.Item(j).Item("ModulePage").ToString()
                                .Target = "_New"
                            End With                            TV.ChildNodes.Add(TVP)
                                                    Next                    End If                Next            End If

解决方案 »

  1.   

    Dim DVP As DataView = MyDS.Tables(0).DefaultView
    这句开始有点问题,各位帮帮我啊,VS2005
      

  2.   

    只能显示第一个节点及其子节点,错误信息如下:System.IndexOutOfRangeException: 索引 1 不是为负数,就是大于行数。 在 System.Data.DataView.GetElement(Int32 index) 在 System.Data.DataView.get_Item(Int32 recordIndex) 在 _Default.FillData() 位置 D:\Programme\WEB\XFMIS\Default.aspx.vb:行号 62 
      

  3.   

    递归/类似栈访问的时候,最好 DataTable.Select(...) 进行访问 DataRow, 否则容易错误,因为内层循环会改变外层 DataView
      

  4.   

    我一般也都是使用DataRow
    比如:
    Dim DVP As DataView = MyDS.Tables(0).DefaultView
    改成:
    Dim DVP As DataRow[] = MyDS.Tables(0).Select("ModuleOrder<>0 AND ModuleParent=" & DV.Item(i).Item("ModuleID").ToString())
      

  5.   

                Dim DV As DataView = MyDS.Tables(0).DefaultView
                DV.RowFilter = "ModuleOrder=0"
                If DV.Count > 0 Then
                    For i As Integer = 0 To DV.Count - 1
                        .......
                        Dim DVP As DataView = MyDS.Tables(0).DefaultView
                        DVP.RowFilter = "ModuleOrder<>0 AND ModuleParent=" & _
                        ..........很明显的,自己想想吧。脑子中要有活生生的图像。
      

  6.   


     Dim DVP As DataRow() = MyDS.Tables(0).Select("ModuleOrder <>0 " & _
                        " AND ModuleParent=" & DV.Item(i).Item("ModuleID").ToString())                    If DVP.Length > 0 Then                        For j As Integer = 0 To DVP.Length - 1                            Dim TVP As TreeNode = New TreeNode                            With TVP
                                    .Text = DVP(j).Item("ModuleName")
                                    .Value = DVP(j).Item("ModuleParent")
                                    .NavigateUrl = DVP(j).Item("ModulePage").ToString()
                                    .Target = "_New"
                                End With                            TV.ChildNodes.Add(TVP)                        Next                    End If
    改成这样,可以了, 谢谢!