【问题标题】:How to get item bound to control by repeater?如何让项目绑定到转发器控制?
【发布时间】:2011-07-02 03:13:24
【问题描述】:

我在中继器中有“BasketControl”控件:

<asp:Repeater runat="server" ID="rptItems">
    <ItemTemplate>
        <uc:BasketControl runat="server" ID="ucBasket" />
    </ItemTemplate>
</asp:Repeater>

BasketObject 列表绑定了repeater 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;
    }
}

应该很简单,但在谷歌上找不到任何提示...

附:我应该处理“OnItemDataBound”中继器事件并将数据对象分配给控件吗?还是有更快/更简单的方法?

谢谢

【问题讨论】:

  • 您想在数据绑定后访问项目?例如,您的项目有一个按钮,点击时您想做一些事情?或者您想在数据绑定中访问该项目?
  • 增强的问题更具体

标签: c# asp.net repeater


【解决方案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 的标记中。但基本思路还是一样的。

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

我建议在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 事件。如果还有其他方法可以做到这一点,我不确定它是什么。

【讨论】:

  • 我知道这种方法,但现在试图找到是否有另一种方法。会让问题更清楚一点。
  • 用另一种选择更新了我的答案。
  • 好的,这可能只是一个选项,但在中继器内部(在 mrak-up page0 上)我们可以访问绑定对象(Container.DataItem)。在 WPF 中,我们也可以使用(如果我没记错的话,像 DataItem 之类的东西)......我正在寻找不需要额外努力将绑定项目分配给控件的解决方案。
  • 据我所知,没有。您必须自己连接控件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
相关资源
最近更新 更多