如何在转发器内创建嵌套的LinkBut​​tons?

时间:2011-07-19 06:05:15

标签: asp.net repeater linkbutton

我需要在asp.net页面中创建一个看起来像树视图的嵌套链接按钮,但都是链接按钮。示例如下所示:

ParentLinkButton1
    ChildLinkButton1
    ChildLinkButton2
    ChildLinkButton3
ParentLinkButton2
    ChildLinkButton1
    ChildLinkButton2
ParentLinkButton3
ParentLinkButton4
    ChildLinkButton1

我真的不知道该怎么做。基于我的研究,这可以通过重复控制来完成,但我不知道该怎么做...请你如果能一步一步地教我......

提前致谢!

2 个答案:

答案 0 :(得分:2)

以下示例使用ListView而不是Repeater。 ListView很棒,因为它们可以为Repeater提供更大的灵活性。此外,正如您在下面的示例代码中所看到的,绑定嵌套/子ListView都可以以声明方式完成,而无需任何代码隐藏

以下代码将生成的示例

enter image description here

ASPX

<asp:ListView runat="server" ID="lvw">
    <LayoutTemplate>
        <ul>
            <li id="itemPlaceholder" runat="server" />
        </ul>
    </LayoutTemplate>
    <ItemTemplate>
        <li>    
            <asp:LinkButton runat="server" CommandArgument='<%# Eval("Name")%>'><%# Eval("Name")%></asp:LinkButton>
            <asp:ListView runat="server" ID="lvw2" DataSource='<%# Eval("Children")%>'>
                <LayoutTemplate>
                    <ul>
                        <li id="itemPlaceholder" runat="server" />
                    </ul>
                </LayoutTemplate>
                <ItemTemplate>
                    <li><asp:LinkButton runat="server" CommandArgument='<%# Eval("Name")%>'><%# Eval("Name")%></asp:LinkButton></li>
                </ItemTemplate>
            </asp:ListView>
        </li>
    </ItemTemplate>
</asp:ListView>

<强> C#

lvw.DataSource = personList;
lvw.DataBind();

如您所见,在C#代码中,我创建了一个“Person”列表,如下所示。每个Person对象都有一个子Person对象列表。通过以这种方式创建对象,绑定ListView就像我所展示的那样简单。使用下面的Person对象运行快速示例,以便您自己查看。

人物对象

public class Person
{
    public string name { get; set; }
    public List<Person> Children { get; set; }
}

对于您的测试,您可以按如下方式创建Page_Load方法:

protected void Page_Load(object sender, EventArgs e)
    {
        List<Person> personList = new List<Person>();
        Person person1 = new Person() { name = "Child 1" };
        Person person2 = new Person() { name = "Child 2" };
        List<Person> childPersonList1 = new List<Person>();
        childPersonList1.Add(person1);
        childPersonList1.Add(person2);
        Person person3 = new Person() { name = "Person 1" };
        person3.Children = childPersonList1;
        personList.Add(person3);
        Person person4 = new Person() { name = "Child 3" };
        Person person5 = new Person() { name = "Child 4" };
        List<Person> childPersonList2 = new List<Person>();
        childPersonList2.Add(person4);
        childPersonList2.Add(person5);
        Person person6 = new Person() { name = "Person 2" };
        person6.Children = childPersonList2;
        personList.Add(person6);
        Person person7 = new Person() { name = "Child 5" };
        Person person8 = new Person() { name = "Child 6" };
        List<Person> childPersonList3 = new List<Person>();
        childPersonList3.Add(person7);
        childPersonList3.Add(person8);
        Person person9 = new Person() { name = "Person 3" };
        person9.Children = childPersonList3;
        personList.Add(person9);

        lvw.DataSource = personList;
        lvw.DataBind();
    }

请参阅以下StackOverflow问题,以了解有关Repeater和ListView之间差异的更多信息:Repeater, ListView, DataList, DataGrid, GridView ... Which to choose?

答案 1 :(得分:1)

我建议在转发器内部使用转发器。

<asp:Repeater id="rptParentLinkButtons" runat="server">
    <asp:LinkButton id="lnkParentbutton" runat="server" Text="<% Eval("ParentText") %>" />
    <ItemTemplate>
        <asp:Repeater id="rptChildLinkButtons" runat="server" DataSource='<% Eval("ChildElements") %>' >
            <ItemTemplate>
                <asp:LinkButton id="lnkChildButton" runat="server" text="<% Eval("ChildText") %>" />
            </ItemTemplate>
        </asp:Repeater>
    </ItemTemplate>
</asp:Repeater>

然后在ItemDataBound事件中,您可以设置子转发器的数据源并将其绑定。

随时要求澄清。我不想为你写整篇文章。

编辑:

要绑定父级,您可能希望使用Page Load或其他一些页面事件将数据源添加到外部转发器,然后将其绑定。

protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            rptParentLinkButtons.DataSource = myParentItemCollection;
            rptParentLinkButtons.DataBind();
        }

然后你有2个选项,通过使用eval访问你的数据绑定对象,或者使用父的ItemDataBound事件,我在上面的asp中展示它的方式。

void rptParentLinkButtons_ItemDataBound(Object Sender, RepeaterItemEventArgs e) {

          // This event is raised for the header, the footer, separators, and items.

          Repeater childRepeater = (Repeater)e.Item.FindControl("rptChildLinkButtons");
          // Set the source of the child equal to a collection on the parent object for it to make the child links.
          childRepeater.DataSource = myParentItemCollection[e.Item.ItemIndex].childElements;
       }    

上面的代码并不完美,但它应该让你对如何完成其​​余部分有个好主意,

干杯,