1

我是在 vb 中使用中继器的新手,我试图以编程方式了解如何使用嵌套的项目符号列表。我有在一个对象中生成我的数据的代码,System.Web.UI.WebControls.TreeView我正试图将它放入一个嵌套的项目符号列表中。我有以下 vb 和 asp 代码:
TreeView.aspx

<asp:Repeater ID="repeater" runat="server" EnableViewState="False" OnItemDataBound="repeater_ItemDataBound">
    <HeaderTemplate>
        <ul>
    </HeaderTemplate>
    <ItemTemplate>
        <li>
            <asp:BulletedList ID="bulletedList" runat="server"></asp:BulletedList>
        </li>
    </ItemTemplate>
    <FooterTemplate>
        </ul>
    </FooterTemplate>
</asp:Repeater>

树视图.aspx.vb

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim tNode As TreeNode
    Dim treeView As New TreeView
    Dim tNodeCollection As New TreeNodeCollection
    tNodeCollection = treeView.Nodes

    ' Code to generate and store within
    ' a System.Web.UI.WebControls.TreeView object
    ' ...
    ' ...
    ' ...

    repeater.DataSource = tNodeCollection          '''<-----UPDATED
    repeater.DataBind()
End Sub

''' UPDATED 
Private Sub searchChildNodes(childNodes As TreeNodeCollection, bList As BulletedList)
    Dim tNode As TreeNode
    For Each tNode In childNodes
        bList.Items.Add(tNode.Value)
        If tNode.ChildNodes.Count > 0 Then
            searchChildNodes(tNode.ChildNodes, bList)
        End If
    Next
End Sub

最终,我的目标是生成一个嵌套列表,如下所示。

<ul>
  <li>My WorkPlace
    <ul>
      <li>Dept 1
        <ul>
            <li>Office
                <ul>
                    <li>Sub-Office</li>
                </ul>
            </li>
        </ul>
      </li>
      <li>Dept 2</li>
      <li>Dept 3</li>
    </ul>
  </li>
</ul>

我似乎无法让它工作。请让我知道我做错了什么以及如何纠正我的方法。

更新:我通过正确指定TreeNodeCollection与转发器的数据绑定来更新我的代码。话虽如此,我还为 OnItemDataBound 添​​加了一个方法:

Protected Sub repeater_ItemDataBound(sender As Object, e As RepeaterItemEventArgs)
    Dim tNode As TreeNode
    Dim bList As New BulletedList
    tNode = e.Item.DataItem

    If (tNode Is Nothing) Then
        Return
    End If

    bList = e.Item.FindControl("bulletedList")
    bList.Items.Add(tNode.Text)

    If tNode.ChildNodes.Count > 0 Then
        searchChildNodes(tNode.ChildNodes, bList)
    End If
End Sub

我仍然无法使用列表进行嵌套。我最终希望实现上面提到的嵌套列表。请告知,以便我可以纠正我的方法。

4

1 回答 1

0

虽然我更愿意使用< asp:BulletedList >,但我有解决方案HtmlGenericControl, < ul >, < li >

树视图.aspx

<asp:Repeater ID="rptr" runat="server" EnableViewState="False" OnItemDataBound="repeater_ItemDataBound">
    <HeaderTemplate>
        <ul>
            <li>My WorkPlace
                <ul>
    </HeaderTemplate>
    <ItemTemplate>
        <li id="listItem" runat="server"></li>
    </ItemTemplate>
    <FooterTemplate>
                </ul>
            </li>
        </ul>
    </FooterTemplate>
</asp:Repeater>

树视图.aspx.vb

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim tNode As TreeNode
    Dim treeView As New TreeView
    Dim tNodeCollection As New TreeNodeCollection
    tNodeCollection = treeView.Nodes

    ' Code to generate and store within
    ' a System.Web.UI.WebControls.TreeView object
    ' ...
    ' ...
    ' ...

    repeater.DataSource = tNodeCollection          '''<-----UPDATED
    repeater.DataBind()
End Sub

Protected Sub repeater_ItemDataBound(sender As Object, e As RepeaterItemEventArgs)
    Dim tNode As TreeNode
    Dim li As New HtmlGenericControl
    Dim ul As New HtmlGenericControl("ul")
    tNode = e.Item.DataItem

    If (tNode Is Nothing) Then
        Return
    End If

    li = e.Item.FindControl("listItem")
    li.ID = tNode.Value
    li.InnerHtml = tNode.Text

    If tNode.ChildNodes.Count > 0 Then
        li.Controls.Add(ul)
        searchChildNodes(tNode.ChildNodes, ul)
    End If
End Sub

Private Sub searchChildNodes(childNodes As TreeNodeCollection, ul As HtmlGenericControl)
    Dim tNode As TreeNode
    For Each tNode In childNodes
        Dim li As New HtmlGenericControl("li")
        li.ID = tNode.Value
        li.InnerHtml = tNode.Text
        ul.Controls.Add(li)
        If tNode.ChildNodes.Count > 0 Then
            Dim unorderedList As New HtmlGenericControl("ul")
            li.Controls.Add(unorderedList)
            searchChildNodes(tNode.ChildNodes, unorderedList)
        End If
    Next
End Sub
于 2015-12-07T19:19:28.550 回答