C# 访问中继器内的控件

C# 访问中继器内的控件,c#,asp.net,user-controls,sitecore,C#,Asp.net,User Controls,Sitecore,假设我有以下几点: <asp:Repeater ID="repSubItems" runat="server" DataSource="<%# SubItems %>" > <ItemTemplate> <sc:FieldRenderer ID="FieldRenderer1" FieldName="BlurbSpot_Content_SubHeading" runat="ser

假设我有以下几点:

<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>

但是在
中继器中
我无法访问
FieldRender1
控件。

您需要处理
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 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;  
}

受保护的void fieldrender1\u数据绑定(对象发送方,System.EventArgs e)
{
FieldRender rend=(FieldRenderer)(发送方);
//你可以在这一点上做任何你想撕裂的事情,它的范围仅限于
//控件,这样您就不必搜索它了。
格式样式[“宽度”]=MyColWidth;
}

+1。您还需要向中继器本身注册
repSubItems\u ItemDataBound
OnDataBinding
控件是一种更好的方法。不依赖于
FindControl
或命名,并且您的代码的作用域为该控件,因此您可以随意移动它。不知道
OnDataBinding
的功能--感谢您的提示@Mark Ursino这是最好的方法,但由于某些原因很少使用。我认为在ASP.NET初期,所有的示例都围绕着
ItemDataBound
展开,因此搜索和查找变得非常容易,尽管从一开始就有了更好的方法。
<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;  
}