首页 > 解决方案 > 带变量的节点

问题描述

我不是经验丰富的 vb.net 程序员,所以我正在努力处理一些与树视图节点实现相关的代码:

我的目标是实现与“材料清单”相关的分层和可编辑结构(例如,房屋有地基、墙壁、屋顶……而墙壁有石头、石膏……)层次结构(根据定义)是未知的。

我能够将带有 SQL 数据的树视图(1)填充到多个但固定数量的级别。我实现的代码:

TreeView1.Nodes.Add(var01, var01).Nodes.Add(var02, var02)(示例 2 级)

结构内的名称var01var02位置(例如 House-Wall)。节点结构是使用“for - next 循环”构建的

通过添加“ .Nodes.Add(varXX, varXX)”我可以扩展结构的级别。然而,我的目标是.Nodes.Add(varXX, varXX)通过循环实现“添加”,使层次结构的数量灵活。

我试图将Treeview1.Nodes... 转换为字符串并通过循环构建(整体)字符串。然后我尝试将此字符串转换为树视图控件。不幸的是,这个原则不起作用。

任何意见,将不胜感激。

标签: vb.net

解决方案


尝试这样的事情:

 Public Function GetBOMTree() As TreeNode
      Dim BOMTable As DataTable

      ' Assuming your hierarchy is small enough to do a full table load into BOMTable, put your SQL statements here

      Dim BOMDictionary = BOMTable.Rows.Cast(Of DataRow) _ ' Assumed to be a data table 
             .Where(Function(F) F.Item("ParentKey").GetType IsNot GetType(DBNull)) _
             .GroupBy(Function(F) CInt(F.Item("ParentKey"))) _ ' Assuming integer keys 
             .ToDictionary(Function(F) F.Key)

      Dim Root = BOMTable.Rows.Cast(Of DataRow) _
           .Where(Function(F) F.Item("ParentKey").GetType Is GetType(DBNull)) _
           .FirstOrDefault

      If Root IsNot Nothing Then

         Dim GetTree As Func(Of DataRow, TreeNode) = ' The "as Func" is necessary to allow recursion
               Function(D As DataRow) As TreeNode
                  Dim Result As New TreeNode
                  Dim Key = CInt(D.Item("PrimaryKey"))

                  Result.Tag = Key 
                  Result.Text = CStr(D.Item("Description"))

                  If BOMDictionary.ContainsKey(Key) Then 
                     Dim Children = BOMDictionary.Item(Key)
                     For Each Child In Children.OrderBy(function(F) cstr(f.item("Description")))
                        Result.Nodes.Add(GetTree(Child))
                     Next
                  End If
                  Return Result

               End Function

         Return GetTree(Root)
      Else
         Return Nothing
      End If



   End Function

它的工作方式是使用一点递归和一些 LINQ to 对象来获取初始字典。我假设您的层次结构在您的表中而不是外部表中,但如果它是外部的,您可以修改您在此处看到的内容以使其工作。我假设整数键。如果您使用的是 GUID,则代码修改起来很简单,只需适当地进行转换即可。


推荐阅读