1

再帰的な関係を持つリスト (HTML) を作成しようとしています。データはデータセット内にありますが、簡単であればデータ テーブルに変換できます。

これを達成するための最良の選択肢は何なのかわかりません。ネストされたリピーターの使用を考えていました。

データは次のとおりです。

__ID__ | __NAME__  | __PARENT__     | __LEVEL__ 
1      | Patrick   |                | 1           
2      | Mark      |                | 1
3      | Scott     | 2              | 2
4      | Jason     |                | 1
5      | Julian    |                | 1
6      | John      | 6              | 2
7      | Steve     |                | 1
8      | George    | 1              | 2
9      | Robert    | 1              | 2 
10     | Rodney    | 8              | 3

ここで私が生成したい出力

- Patrick [1]
  - George [8]
    - Rodney [10]
  - Robert [9]

- Mark [2]
  - Scott [3]

- Julian [5]
  - John [6]

- Jason [4]

- Steve [7]
4

2 に答える 2

2

これを行う最も簡単な方法は、再帰メソッドを記述することです。操作方法は、メソッドにツリー構造のリスト全体を返すようにするか、読み取り時にデータを出力させるかによって異なります。読み取ったデータを出力したい場合、コードは次のようになります。

Private Sub OutputTree(data As DataTable, parentId As String, indentationLevel As Integer)
    For Each row As DataRow In GetChildRows(parentId)
        OutputRow(row, indentationLevel)
        OutputTree(data, row("ID").ToString(), indentationLevel + 1)
    Next
End Sub

上記のコードはGetChildRows、指定された親 ID を含むすべての行のリストを返すメソッドも実装していることを前提としています。OutputRowまた、指定されたインデント レベルで指定された行を出力するメソッドが呼び出されていることも前提としています。

次に、次のようにメソッドを呼び出すことができます。

OutputTree(myDataTable, nothing, 0)

ツリー構造を構築して返したい場合 (これは間違いなく優れたアプローチです)、コードは次のようになります。

Private Function BuildTreeNodes(data As DataTable, parentId As String) As List(Of MyTreeNode)
    Dim nodes As List(OfNew MyTreeNode)()
    For Each row As DataRow In GetChildRows(parentId)
        Dim node As New TreeNode()
        node.Row = row
        node.Children = BuildTreeNodes(data, row("ID").ToString())
        nodes.Add(node)
    Next
    Return node
End Sub

上記のコードは、次のMyTreeNodeようなクラスが定義されていることを前提としています。

Public Class MyTreeNode
    Public Property Row As DataRow
    Public Property Children As List(Of MyTreeNode)
End Class

次に、次のようにメソッドを呼び出すことができます。

Dim rootLevelNodes As List(Of MyTreeNode) = BuildTreeNodes(myDataTable, Nothing)
于 2013-07-25T13:17:16.917 に答える