Как создать вложенные кнопки ссылки внутри повторителя? - PullRequest
1 голос
/ 19 июля 2011

Мне нужно создать вложенные кнопки ссылок на странице asp.net, которая выглядит как древовидная структура, но все они являются кнопками ссылок.Пример показан ниже:

ParentLinkButton1
    ChildLinkButton1
    ChildLinkButton2
    ChildLinkButton3
ParentLinkButton2
    ChildLinkButton1
    ChildLinkButton2
ParentLinkButton3
ParentLinkButton4
    ChildLinkButton1

Я действительно не знаю, как это сделать.Основываясь на моих исследованиях, это можно сделать с помощью повторного контроля, но я не знаю, как это сделать ... Пожалуйста, если вы можете научить меня шаг за шагом ...

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 20 июля 2011

В следующем примере используется ListView вместо Repeater.ListViews великолепны, потому что они дадут вам гораздо большую гибкость по сравнению с 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 для запуска быстрого примера, чтобы вы могли сами убедиться в этом.

Объект 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 ... Какой выбрать?

1 голос
/ 19 июля 2011

Я бы порекомендовал сделать ретранслятор внутри ретранслятора.

<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 вы можете установить источник данных для дочернего повторителя и связать его.

Не стесняйтесь спрашивать о любых разъяснениях. Я не хочу писать все это для вас.

EDIT:

Чтобы связать родителя, вы можете использовать Page Load или какое-либо другое событие страницы, чтобы добавить источник данных к внешнему повторителю и затем связать его.

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

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

И затем у вас есть 2 варианта, с тем, как я показал это в asp выше, путем доступа к объекту с привязкой к данным с помощью eval или с помощью события ItemDataBound родительского элемента.

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;
       }    

Приведенный выше код не идеален, но он должен дать вам хорошее представление о том, как пройти остаток пути,

Приветствия

...