2012-01-20 8 views
0

私は、次のしているとしましょう:行うことができ、私は背後にあるコードにしたいリピーター内の制御へのアクセス

<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にアクセスすることはできませんコントロール。

答えて

6

repSubItemsリピーターのItemDataBoundイベントを処理する必要があります。例:あなたは、あなたがRepeaterに特異的に探している行を検索し、コントロールを見つける必要がある

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

    } 
} 
+1

+1。リピータ自体に 'repSubItems_ItemDataBound'を登録する必要もあります。 –

+0

コントロールのための 'OnDataBinding'はこれを行うもっと良い方法です。 'FindControl'や命名に依存せず、あなたのコードはコントロールにスコープされているので、あなたは望みどおりに動かすことができます。 – Kelsey

1

。そして、あなたが行うには、検索を持っていないので、具体的コントロールのためのOnDataBindingを実装することですこれを行うには

// 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; 
} 

良い方法:ここでの例では、あなたのRepeater内のすべてのアイテムのためにそれを行うことができるということです

<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; 
} 
+1

'OnDataBinding'の機能を認識していませんでした - チップをありがとう! –

+0

@Mark Ursinoこれは最善のアプローチですが、なんらかの理由でめったに使用されません。 ASP.NETの初期段階では、すべての例題が 'ItemDataBound'の周りを回っていると思いますので、始めからかなり良い方法が含まれていても、検索して見つけやすくなりました。 – Kelsey