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

发布于 2024-11-24 23:24:07 字数 358 浏览 2 评论 0原文

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

ParentLinkButton1
    ChildLinkButton1
    ChildLinkButton2
    ChildLinkButton3
ParentLinkButton2
    ChildLinkButton1
    ChildLinkButton2
ParentLinkButton3
ParentLinkButton4
    ChildLinkButton1

我真的不知道该怎么做。根据我的研究,这可以通过重复控制来完成,但我不知道该怎么做...请您能一步一步教我...

提前致谢!

I need to create a nested linkbuttons in a asp.net page that looks like a treeview, but all are linkbuttons. Example is shown below:

ParentLinkButton1
    ChildLinkButton1
    ChildLinkButton2
    ChildLinkButton3
ParentLinkButton2
    ChildLinkButton1
    ChildLinkButton2
ParentLinkButton3
ParentLinkButton4
    ChildLinkButton1

I really don't know how to do this. Based on my research this can be done using repeated control but I don't know how to do that... Please if you can teach me step by step...

Thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

岁月染过的梦 2024-12-01 23:24:07

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

以下代码将生成的示例

在此处输入图像描述

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 ... 选择哪个?

The following example uses a ListView instead of a Repeater. ListViews are great because they'll give you much more flexibility over a Repeater. Moreover, as you can see in the sample code below, binding the nested/child ListView can all be done declaratively without any code-behind.

Example of what the following code will produce

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();

As you can see, in the C# code, I've created a list of "Person" as follows. Each Person object has a list of child Person objects. By creating your objects in this manner, binding the ListView is really as simple as I've shown. Use the Person object below to run a quick sample so you can see for yourself.

Person object

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

For your test, you can create a Page_Load method as follows:

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

See the following StackOverflow question to learn more about the differences between a Repeater and a ListView: Repeater, ListView, DataList, DataGrid, GridView ... Which to choose?

莳間冲淡了誓言ζ 2024-12-01 23:24:07

我建议在中继器内部做一个中继器。

<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 事件中,您可以设置子中继器的数据源并绑定它。

请随时询问任何澄清。我不想为你写下整件事。

编辑:

要绑定父级,您需要使用页面加载或其他页面事件将数据源添加到外部转发器,然后绑定它。

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

上面的代码并不完美,但它应该让您了解如何完成其​​余的工作,

干杯,

I would recommend doing a repeater inside of a repeater.

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

And then in the ItemDataBound events you can set the data source for the child repeater and bind it.

Feel free to ask for any clarifications. i don't want to write the whole thing for you.

EDIT:

To bind the parent, you would want to use Page Load or some other page event to add the datasource to the outer repeater and then bind it.

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

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

And then you have 2 options, wither the way I showed it in the asp above by accessing your databound object using the eval, or by using the parent's ItemDataBound event.

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

The above code is not perfect, but it should get you a good idea on how to get the rest of the way,

Cheers,

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文