stonypaul Ответов: 2

Репитер в ретранслятор


У меня есть таблица базы данных Place_Names, которая имеет отношение внешнего ключа к таблице регионов. Я хочу отобразить эти данные на странице ascx с каждым регионом в качестве заголовка и его дочерними элементами топонима в виде флажков ниже. Как на изображении, показанном здесь
флажки[^].
Я думаю, что мне нужен ретранслятор внутри ретранслятора?
Нужно ли мне просто установить источник данных на стороне сервера ретранслятора внешних регионов, а затем внутренний ретранслятор для отображения флажков названия места может забрать идентификатор региона каждый раз, когда он повторяется?

Что я уже пробовал:

Я смотрел что-то вроде этого, но я не уверен, как установить источник данных checkboxlist, особенно потому, что он не сразу доступен, как это происходит в ретрансляторе

<asp:Repeater ID="rptPlaceNamesRegions" runat="server">
     <HeaderTemplate>
        <asp:Label runat="server" ID="lbl" Value='<%# Eval("Region") %>' />
    </HeaderTemplate>
    <ItemTemplate>
        <asp:CheckBoxList ID="cblPlaceNames" runat="server" DataTextField="Text"
            DataValueField="Value" RepeatDirection="Vertical" RepeatColumns="2">
            <asp:ListItem Text="All" Value="" Selected="true" />
        </asp:CheckBoxList>
    </ItemTemplate>
</asp:Repeater>

2 Ответов

Рейтинг:
2

F-ES Sitecore

Используйте событие ItemDataBound в коде позади него. Это c#, но, надеюсь, вы поймете эту идею. Обновите ретранслятор, чтобы добавить событие

<asp:Repeater ID="rptPlaceNamesRegions" runat="server" OnItemDataBound="rptPlaceNamesRegions_ItemDataBound">
     <HeaderTemplate>
        <asp:Label runat="server" ID="lbl" Value='<%# Eval("Region") %>' />
    </HeaderTemplate>
    <ItemTemplate>
        <asp:CheckBoxList ID="cblPlaceNames" runat="server" DataTextField="Text"
            DataValueField="Value" RepeatDirection="Vertical" RepeatColumns="2">
        </asp:CheckBoxList>
    </ItemTemplate>
</asp:Repeater>


В коде-позади я привязываюсь к списку классов DataObject, но вы, очевидно, используете свои правильные данные

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        var data = new List<DataObject> { new DataObject { Region = "Region A" }, new DataObject { Region = "B" } };
        rptPlaceNamesRegions.DataSource = data;
        rptPlaceNamesRegions.DataBind();
    }
}

protected void rptPlaceNamesRegions_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    DataObject data = e.Item.DataItem as DataObject;

    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
                
        CheckBoxList cblPlaceNames = (CheckBoxList) e.Item.FindControl("cblPlaceNames");

        // I'm hard-coding for the example but you will get the data based on the "data"
        // object
        cblPlaceNames.DataSource = new ListItem[] { new ListItem { Text = "One", Value = "1" },
            new ListItem { Text = "Two", Value = "2" },
            new ListItem { Text = "Three", Value = "3" },
            new ListItem { Text = "All", Value = "" }};

        cblPlaceNames.DataBind();
    }
}


stonypaul

Я не думаю, что серверное событие itemdatabound для внешнего ретранслятора может видеть checkboxlist, потому что оно находится во внутреннем ретрансляторе?

F-ES Sitecore

Эта строка кода получает ссылку на него

CheckBoxList cblPlaceNames = (CheckBoxList) e.Item.FindControl("cblPlaceNames");

В вашем коде нет вложенного повторителя но если вы хотите получить повторение в повторителе то код похож

Ретранслятор rpt = (ретранслятор) e.Item.FindControl("rptYourRepeater");

stonypaul

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

&ЛТ;АСП:репитер идентификатор="rptRegion" атрибут runat="сервер" onitemdatabound="rptRegion_ItemDataBound"&ГТ;
<headertemplate>
&ЛТ;АСП:метка идентификатор="lblRegion" атрибут runat="сервер" текст="&ЛТ;%# Ивала("OrgDescription") %&ГТ;"&ГТ;

<itemtemplate>
&ЛТ;АСП:репитер идентификатор="rptPlaceName" атрибут runat="сервер"и GT;
<itemtemplate>
&ЛТ;как ASP:CheckBoxList с ИД="cblPlaceName" атрибут runat="сервер" datatextfield="текст"
="" datavaluefield="Value" repeatdirection="Vertical" repeatcolumns="3">
&ЛТ;АСП:текст элемент listitem="все" значения="" некоторые="правда"и GT;








Защищенный Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Обрабатывает Меня.Load
Если Не Пейдж.Тогда IsPostBack
рптрегион.Источник Данных = GetOrgs()
рптрегион.Привязку()
Конец, Если
Конец Подводной Лодки

Рейтинг:
2

Vincent Maverick Durano

Вот что вы можете сделать:

1. Персонализация вашего ребенка/вложенные Repeater около ItemDataBound случае ваших родителей Repeater:

Protected Sub Repeater1_ItemDataBound(ByVal sender As Object, ByVal e As RepeaterItemEventArgs)
    If (e.Item.ItemType = ListItemType.Item) OrElse (e.Item.ItemType = ListItemType.AlternatingItem) Then
        Dim childRepeater As Repeater = TryCast(e.Item.FindControl("Repeater2"), Repeater)
        childRepeater.DataSource = GetDataForInnerRepeater() ' Set the data source here for your inner Repeater
        childRepeater.DataBind()
    End If
End Sub


2. Затем на ItemDataBound событие вашего ребенка/внутреннего Repeater, вы можете получить доступ к вашим CheckBoxList как уже предлагалось:

Protected Sub Repeater2_ItemDataBound(ByVal sender As Object, ByVal e As RepeaterItemEventArgs)
    If (e.Item.ItemType = ListItemType.Item) OrElse (e.Item.ItemType = ListItemType.AlternatingItem) Then
        Dim cbl As CheckBoxList = CType(e.Item.FindControl("cblPlaceNames"), CheckBoxList)
        cbl.DataTextField = "FieldName"
        cbl.DataValueField = "FieldName"
        cbl.DataSource = GetYourCheckBoxDataSource() ' Set the data source for your CheckBoxList here
        cbl.DataBind()
    End If
End Sub



В качестве альтернативы, если ваш внутренний Repeater уже ограничившись данными, вы можете попробовать получить доступ к CheckBoxList около ItemDataBound случае ваших родителей Repeater подобный этому:

Protected Sub Repeater1_ItemDataBound(ByVal sender As Object, ByVal e As RepeaterItemEventArgs)
    If (e.Item.ItemType = ListItemType.Item) OrElse (e.Item.ItemType = ListItemType.AlternatingItem) Then
        Dim childRepeater As Repeater = CType(e.Item.FindControl("Repeater2"), Repeater)

        For Each item As RepeaterItem In childRepeater.Items

            If item.ItemType = ListItemType.AlternatingItem OrElse item.ItemType = ListItemType.Item Then
                Dim cbl As CheckBoxList = CType(item.FindControl("cblPlaceNames"), CheckBoxList)
                cbl.DataTextField = "FieldName"
                cbl.DataValueField = "FieldName"
                cbl.DataSource = GetYourCheckBoxDataSource()
                cbl.DataBind()
            End If
        Next
    End If
End Sub