我想从数据库的表中执行3级嵌套转发器。我有一个类别,其中包含一组问题和一组问题。
很想知道如何实现这种情况。
2级中继器并不那么难,但是当它达到另一个故事的3级时......
注意:我正在使用ASP.NET Webforms。请,我不想要一个DataSet或DataTable的例子。
谢谢!
答案 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,当然,您需要将列名更改为您在数据库表中使用的任何名称,但这应该可以帮助您入门。