Повторитель в ретрансляторе
У меня есть ретранслятор внутри ретранслятора. Если родительский ретранслятор связан с Datatble
, в котором есть столбец с Datatable
.
Я хотел бы привязать дочерний повторитель к столбцу данных в родительском повторителе datarow
Возможно ли это? Я думал, что могу сделать это непосредственно в файле aspx
, например:
DataSource="<%# DataBinder.Eval(Container.DataItem, "Products")%>"
, но он не работает.
Ответы
Ответ 1
В родительском ретрансляторе приложите метод к событию OnItemDataBound и в методе найдите вложенный ретранслятор и привяжите его данные.
Пример (.aspx):
<asp:Repeater ID="ParentRepeater" runat="server" OnItemDataBound="ItemBound">
<ItemTemplate>
<!-- Repeated data -->
<asp:Repeater ID="ChildRepeater" runat="server">
<ItemTemplate>
<!-- Nested repeated data -->
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
Пример (.cs):
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ParentRepeater.DataSource = ...;
ParentRepeater.DataBind();
}
}
protected void ItemBound(object sender, RepeaterItemEventArgs args)
{
if (args.Item.ItemType == ListItemType.Item || args.Item.ItemType == ListItemType.AlternatingItem)
{
Repeater childRepeater = (Repeater)args.Item.FindControl("ChildRepeater");
childRepeater.DataSource = ...;
childRepeater.DataBind();
}
}
Ответ 2
Я бы добавил событие DataBinding к дочернему ретранслятору:
<asp:Repeater ID="parentRepeater" runat="server">
<asp:Repeater ID="childRepeater" runat="server"
OnDataBinding="childRepeater_DataBinding" />
</asp:Repeater>
Затем просто выполните его:
protected void childRepeater_DataBinding(object sender, System.EventArgs e)
{
Repeater rep = (Repeater)(sender);
int someIdFromParentDataSource = (int)(Eval("ParentID"));
// Assuming you have a function call `GetSomeData` that will return
// the data you want to bind to your child repeater.
rep.DataSource = GetSomeData(int);
rep.DataBind();
}
Я предпочитаю делать это на уровне управления вместо уровня ItemDataBound
, поэтому, если вам когда-либо придется удалять элементы управления или элементы в ваших шаблонах, вам не нужно беспокоиться о поиске кода в родительских элементах управления, которые используют Это. Он получает все локализовать, если сам контролирует себя. Кроме того, вам никогда не придется делать FindControl
.
Если вы хотите заменить элемент управления в будущем, вы можете просто удалить его, и ваш код все равно будет работать, поскольку он полностью изолирован. Использование ItemDataBound
приведет к тому, что ваш код будет компилироваться, но сбой или непредвиденный запуск во время выполнения из-за его зависимости от дочерних элементов управления.
Ответ 3
Вот как это делается:
DataSource='<%# ((System.Data.DataRowView)Container.DataItem)[3] %>'
Итак, если вы знаете столбец в родительской таблице, в котором содержится дочерняя таблица/источник данных для вложенного ретранслятора, вы можете поместить его непосредственно в файл aspx.
Ответ 4
Если мне это нужно, я обычно делаю это, используя событие ItemDataBound родительского ретранслятора для привязки дочернего ретранслятора. Если e - ваш параметр EventArgs, у вас будет доступ к дочернему ретранслятору через e.Item.FindControl() и доступ к данным через e.Item.DataItem.
Ответ 5
Вот пример того, как это сделать:
Статья для вложенного управления ретрансляторами
Ответ 6
Repeater1 Событие OnItemDataBound, затем FindControl Repeater2. Код не найдет вложенный Repeater2!. Вам нужно использовать FindControl ( "Repeater2" ).
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.DataItem != null)
{
MemberView dataRow = (MemberView)e.Item.DataItem;
var cat = MemberPresenter.getMemberID(dataRow.memID);
Repeater rp2 = (Repeater)e.Item.FindControl("Repeater2");
rp2.DataSource = cat;
rp2.DataBind();
}
}
Ответ 7
protected void MainRepeater_ItemDataBound(object sender, RepeaterItemEventArgs args)
{
if (args.Item.ItemType == ListItemType.Item || args.Item.ItemType == ListItemType.AlternatingItem)
{
Repeater childRepeater = (Repeater)args.Item.FindControl("ChildRepeater");
DataTable innerTable= ((DataRowView)args.Item.DataItem)["InnerTableColumnName"] as DataTable;
childRepeater.DataSource = tasksDetails;
childRepeater.DataBind();
}
}