如何通过中继器将项目绑定到控件

本文关键字:绑定 控件 项目 何通过 中继器 | 更新日期: 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事件。如果有另一种方法,我不确定它是什么。