ASP.NET 3级嵌套转发器

时间:2011-03-01 20:09:08

标签: asp.net webforms

我想从数据库的表中执行3级嵌套转发器。我有一个类别,其中包含一组问题和一组问题。

很想知道如何实现这种情况。

2级中继器并不那么难,但是当它达到另一个故事的3级时......

注意:我正在使用ASP.NET Webforms。请,我不想要一个DataSet或DataTable的例子。

谢谢!

2 个答案:

答案 0 :(得分:4)

我更喜欢手动嵌套重复控件以消除数据库调用。

进行3次DB调用以获取所有级别数据。第一次调用获取主数据。第二次调用获取所有主记录的所有可能数据。第三次调用从第二次调用结果中获取所有子数据。

然后将所有内容存储在全局可访问的变量中。实现每个嵌套转发器的OnDataBinding。对于每个OnDataBinding事件,请拉出“密钥”并对嵌套数据执行过滤并绑定它。

例如:

DataSet1 - Master data
DataSet2 - All possible child data for DataSet1
DataSet3 - All possible child data for DataSet2

Repeater1 - Bind to DataSet1
Repeater2 - OnDataBinding bind the filtered DataSet2 based on DataSet1 current key
Repeater3 - OnDataBinding bind the filtered DataSet3 based on DataSet2 current key

答案 1 :(得分:2)

扩展Kelsey的答案(如果我在这里有足够的代表,我会投票,但这是我在StackExchange上的第一篇文章 - 但我会在我能够的时候!编辑:我已经投票了! ),这里有一些可能有用的代码,因为我必须做这件事(使用不同类型的组,但基本上是相同的),Kelsey的回答也帮助了我。

请注意,这可能并不完美,但它对我有用。我有兴趣改进它。它与凯尔西的方法略有不同。

就我而言,我在ASP.NET(VB)应用程序的导航菜单中使用了3级嵌套转发器。

首先,设置一个数据集以绑定到代码隐藏中的父转发器。 (我知道你说你对数据集或数据表的答案不感兴趣,但我不确定一个更好的方法 - SOMETHING必须数据转发到转发器......)

' first load up some datatables with some data.
' you will probably want to optimize how you are grabbing the data
Dim dtCategories As DataTable = GetCategories
Dim dtQuestionGroups As DataTable = GetQuestionGroups
Dim dtQuestions As DataTable = GetQuestions

' name the tables
dtCategories.TableName = "Categories"
dtQuestionGroups.TableName = "QuestionGroups"
dtQuestions.TableName = "Questions"

' add the datatables to a dataset and set some relationships
Dim ds As DataSet = New DataSet
ds.Tables.Add(dtCategories)
ds.Tables.Add(dtQuestionGroups)
ds.Tables.Add(dtQuestions)

' note that your column name identifiers may be different.
ds.Relations.Add("CatQgrp", _ 
    ds.Tables("Categories").Columns("id"), _ 
    ds.Tables("QuestionGroups").Columns("CatID"))

ds.Relations.Add("QgrpQues", _ 
    ds.Tables("QuestionGroups").Columns("id"), _ 
    ds.Tables("Questions").Columns("QgrpID"))

' bind to repeater. only need to bind the parent table
parentRepeater.DataSource = ds.Tables("Categories")
parentRepeater.DataBind()

现在我们已经设置了数据,我们可以在aspx页面上显示它。

<ul>
    <li>CATEGORIES
        <ul>
            <asp:repeater id="parentRepeater" runat="server">
                <itemtemplate>
                    <li><%# DataBinder.Eval(Container.DataItem, "CategoryName")%>
                        <ul>
                            <!-- start child repeater 1, which will show the question groups-->
                            <asp:repeater id="childRepeater1" datasource='<%# Container.DataItem.Row.GetChildRows("CatQgrp") %>' runat="server">
                                <itemtemplate>
                                    <li><%# Container.DataItem("QgrpName")%>
                                        <ul>
                                            <!-- start child repeater 2, which will show the questions-->
                                            <asp:repeater id="childRepeater2" datasource='<%# Container.DataItem.GetChildRows("QgrpQues") %>' runat="server">
                                                <itemtemplate>
                                                    <li><%# Container.DataItem("QuestionName")%></li>
                                                </itemtemplate>
                                            </asp:repeater>
                                        </ul>
                                    </li>
                                </itemtemplate>
                            </asp:repeater>
                        </ul>
                    </li>
                </itemtemplate>
            </asp:repeater>
        </ul>
    </li>
</ul>

YMMV,当然,您需要将列名更改为您在数据库表中使用的任何名称,但这应该可以帮助您入门。