如何通过中继器将项目绑定到控件
本文关键字:绑定 控件 项目 何通过 中继器 | 更新日期: 2023-09-27 18:00:51
我在中继器内部有"BasketControl"控制:
<asp:Repeater runat="server" ID="rptItems">
<ItemTemplate>
<uc:BasketControl runat="server" ID="ucBasket" />
</ItemTemplate>
</asp:Repeater>
BasketObject的列表绑定了转发器DataSource属性。
public class MyParentControl : System.Web.UI.UserControl
{
void Page_Load(object sender, EventArgs e) {
if(!IsPostback) {
rptItems.DataSource = ...; // List<BasketObject>
rptItems.DataBind();
}
}
}
如何访问BasketControl内部的"BasketObject"?我想要的是在类BasketControl中访问BasketObject,例如在"Page_Load"方法中。
public class BasketControl : System.Web.UI.UserControl
{
void Page_Load(object sender, EventArgs e) {
// here I want access BasketObject
BasketObject basket = .... as BasketObject;
}
}
应该很简单,但在谷歌找不到任何提示。。。
p.S.我应该处理"OnItemDataBound"中继器事件并将数据对象分配给控件吗?或者有更快/更简单的方法?
感谢
通常我处理这些事情的方式是处理ItemDatabound
事件。
假设你有这个标记:
<asp:Repeater runat="server" ID="rptItems">
<ItemTemplate>
<uc:BasketControl runat="server" ID="ucBasket" />
</ItemTemplate>
</asp:Repeater>
代码看起来像这样:
protected override void OnInit(EventArgs e) {
base.OnInit(e);
this.rptItems += new RepeaterItemEventHandler(rptItems_ItemDatabound);
}
void Page_Load(object sender, EventArgs e) {
if(!IsPostback) {
rptItems.DataSource = ...; // List<BasketObject>
rptItems.DataBind();
}
}
void rptItems_ItemDatabound(object sender, RepeaterItemEventArgs e) {
BasketControl ucBasket = e.Item.FindControl("ucBasket") as BasketControl;
BasketObject basket = e.Item.DataItem as BasketObject;
// Use datasource/databind, but you could just as easily use a property/method of BasketControl
// Like so: ucBasket.LoadBasket(basket);
ucBasket.DataSource = basket;
ucBasket.DataBind();
}
希望这是清楚的。当然,您也可以使用AutoEventWireup="true"
,并将事件处理程序的名称放在Repeater的标记中。但基本的想法还是一样的。
编辑为了回应你的澄清,你必须明确地将他们联系起来。没有一种自动的方法。
我建议在BasketControl
上公开一个Basket
属性。然后你可以做这样的事情:
<%@ Import Namespace="Your WebApp Namespace Here" %>
<asp:Repeater runat="server" ID="rptItems">
<ItemTemplate>
<uc:BasketControl runat="server" ID="ucBasket" Basket='<%# (Basket)Container.DataItem %>' />
</ItemTemplate>
</asp:Repeater>
并且您不需要处理ItemDatabound
事件。如果有另一种方法,我不确定它是什么。