嵌套转发器 - 从子转发器访问父转发器内的控件

时间:2011-06-03 20:28:35

标签: c# asp.net

我有一个页面,其中列出了几家酒店,每个酒店都列出了用户选择的每个日期的价格。

我的HTML看起来像这样:

<table>
<asp:Repeater ID="rptrHotels" runat="server">
    <ItemTemplate>
        <tr><td><%# Eval("HotelName") %></td></tr>
        <tr>
            <asp:Repeater ID="rptrHotelRates" runat="server" DataSource='<%# GetHotelRates(Container.DataItem) %>'>
                <ItemTemplate>
                    <td>
                        <span class="date"><%# Eval("Date") %></span>
                        <span class="price">$<%# Eval("Price") %></span>
                    </td>
                </ItemTemplate>
            </asp:Repeater>
            <td>
                <span class="date">Total</span>
                <span class="price">$<asp:Literal ID="litTotal" runat="server" /></span>
            </td>
        </tr>                   
    </ItemTemplate>
</asp:Repeater>
</table>

我的代码隐藏:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        DateTime startDate = Request.QueryString["StartDate"];
        DateTime endDate = Request.QueryString["EndDate"];

        List<Hotel> hotels = GetHotels(startDate, endDate);
        rptrHotels.DataSource = hotels;
        rptrHotels.DataBind();
    }
}


protected List<Rate> GetHotelRates(object item)
{
    DateTime startDate = Request.QueryString["StartDate"];
    DateTime endDate = Request.QueryString["EndDate"];
    Hotel hotel = (Hotel)item;

    List<Rate> rates = GetRates(hotel, startDate, endDate);

    decimal total = (from r in rates
                     select r.Price).Sum();

    return rates;
}

在我的GetHotelRates()函数中,我通过总结所有价格来获得总价。但我需要以某种方式将该值放在litTotal中,该值在子转发器之外,但在父转发器内。

我该怎么做?

2 个答案:

答案 0 :(得分:5)

在您的项目绑定事件中执行以下操作:

((Literal)((Repeater)sender).Parent.FindControl("litTotal")).Text;

您可能需要在父级上进行另一次转换才能将其转发到Repeater,但我不确定。

答案 1 :(得分:0)

你总是可以尝试一些NamingContainer.Parent.Parent .... FindControl(夸大)魔术,但更简洁的方法是创建一个单独的方法来获得你的总数:

protected decimal GetHotelTotal(object item)
{
    Hotel hotel = (Hotel)item;

    List<Rate> rates = GetRates(hotel, startDate, endDate);

    decimal total = (from r in rates
                 select r.Price).Sum();
    return total;
}

在你的文字中调用它:

<asp:Literal ID="litTotal" runat="server" Text="<%# GetHotelTotal(Container.DataItem) %>" />