我在转发器内有一个转发器。父转发器绑定到Datatble
的地方,其中包含Datatable
的列。
我想将子转发器绑定到父转发器数据行中的数据表列
这可能吗?我想我可以直接在aspx
文件中执行此操作,如:
DataSource="<%# DataBinder.Eval(Container.DataItem, "Products")%>"
但它似乎不起作用。
答案 0 :(得分:77)
在父转发器中,将方法附加到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();
}
}
答案 1 :(得分:24)
我会将一个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
会导致代码仍然编译但在运行时崩溃或意外动作,因为它依赖于子控件。
答案 2 :(得分:8)
以下是它的完成方式:
DataSource='<%# ((System.Data.DataRowView)Container.DataItem)[3] %>'
因此,如果您知道父表中包含嵌套转发器的子表/数据源的列,则可以将其直接放在aspx文件中。
答案 3 :(得分:2)
如果我需要这样做,我通常使用父转发器的ItemDataBound事件来绑定子转发器。如果e是您的EventArgs参数,您将可以通过e.Item.FindControl()访问子转发器,并通过e.Item.DataItem访问数据。
答案 4 :(得分:2)
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();
}
}
答案 5 :(得分:1)
以下是如何执行此操作的示例: Article for nested repeater control
答案 6 :(得分:0)
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();
}
}