ASP.NET 3 уровень вложенного повторителя - PullRequest
2 голосов
/ 01 марта 2011

хочу сделать 3 уровня вложенного повторителя из таблиц базы данных. У меня есть категория, содержащая группы вопросов и группы вопросов, содержащие вопросы.

Хотелось бы иметь небольшой пример того, как я могу реализовать этот сценарий.

2 уровня повторителя не так сложно, но когда дело доходит до 3 уровня, это другая история ...

Примечание. Я использую веб-формы ASP.NET. Пожалуйста, я не хочу пример с DataSet или DataTable.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 02 марта 2011

Я предпочитаю делать вложение повторяющихся элементов управления вручную, чтобы исключить вызовы БД.

Выполните 3 вызова БД, чтобы получить все данные вашего уровня. Сначала позвоните, чтобы получить свои основные данные. Второй звонок получить все возможные данные для всех основных записей. Третий вызов позволяет получить все возможные дочерние данные из результатов второго вызова.

Затем сохраните все это в глобально доступной переменной. Реализуйте 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
2 голосов
/ 29 июля 2011

Подробно об ответе Келси (за который я бы проголосовал, если бы у меня было достаточно повторений здесь, но это мой самый первый пост на StackExchange - но я сделаю это, когда смогу! РЕДАКТИРОВАТЬ: Я проголосовал за него!), вот некоторый код, который может помочь, так как мне пришлось сделать именно это (с использованием разных типов групп, но по сути это одно и то же), и ответ Келси мне тоже помог.

Обратите внимание, что это, вероятно,не идеально, но это работает для меня.Я заинтересован в улучшении этого.Это немного отличается от подхода Келси.

В моем случае я использую 3 уровня вложенных повторителей в меню навигации в приложении ASP.NET (VB).

Сначала настройте набор данных для привязки к родительскому повторителю в вашем коде.(Я знаю, что вы сказали, что вас не интересуют ответы с наборами данных или таблицами данных, но я не уверен в лучшем способе - что-то должно быть привязано к ретрансляторам ...)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...