繁体   English   中英

访问中继器中的控件

[英]Accessing a control within a Repeater

可以说我有以下几点:

<asp:Repeater ID="repSubItems" runat="server" DataSource="<%# SubItems %>" >
    <ItemTemplate>
        <sc:FieldRenderer ID="FieldRenderer1" 
            FieldName="BlurbSpot_Content_SubHeading" 
            runat="server" 
            Item="<%# Container.DataItem as Sitecore.Data.Items.Item %>" />  
    </ItemTemplate>
</asp:Repeater>

我想在代码背后能够做到:

FieldRenderer1.Style["Width"] = MyCoolWidth;

但是在Repeater我无法访问FieldRenderer1控件。

您将需要处理repSubItems中继器的ItemDataBound事件。 例:

protected void repSubItems_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        var fieldRenderer1 = e.Item.FindControl("FieldRenderer1") as Sitecore.Web.UI.WebControls.FieldRenderer;
        if (fieldRenderer1 != null)
        {
            fieldRenderer1.Style["Width"] = MyCoolWidth;
        }

    }
}

您需要在Repeater找到要查找的行,然后找到控件。 这是可以对Repeater所有项目执行此操作的示例:

// repeater item
foreach (Control cr in repSubItems.Controls)
{
    // assuming this is your templated control name and not the final output name
    FieldRenderer founcControl = cr.FindControl("FieldRenderer1") as FieldRenderer;

    founcControl .Style["Width"] = MyCoolWidth;
}

更好的方法是专门为控件实现OnDataBinding ,因为这样您就不必进行搜索了:

<sc:FieldRenderer ID="FieldRenderer1" FieldName="BlurbSpot_Content_SubHeading"
    runat="server" Item="<%# Container.DataItem as Sitecore.Data.Items.Item %>"
     OnDataBinding="FieldRenderer1_DataBinding" />

protected void FieldRenderer1_DataBinding(object sender, System.EventArgs e)
{
    FieldRenderer rend = (FieldRenderer)(sender);

    // you can do whatever you want to rend at this point and it is scoped to ONLY
    // the control so you never have to search for it.
    rend.Style["Width"] = MyCoolWidth;  
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM