如何通过转发器获取受控制的项目?

时间:2011-07-02 03:13:24

标签: c# asp.net repeater

我在转发器内部有'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'转发器事件并分配数据对象来控制吗?还是有更快/更简单的方法?

由于

1 个答案:

答案 0 :(得分:1)

通常我如何处理这类事情是通过处理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的标记中。但基本思路仍然相同。

编辑为了回应您的澄清,您将不得不明确地将它们连接起来。没有自动的方法。

我建议在Basket上公开BasketControl属性。然后你可以做这样的事情:

<%@ 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事件。如果还有另一种方法,我不确定它是什么。