2009-07-29 8 views
1

データリストを表示するネストされたリピータコントロールがあります。私の場合はFAQリストです。ここでの設計部分は次のとおりです。Cのリピータ内のデータバインドされたコントロールの値を変更する

<asp:Repeater ID="lists" runat="server"> 
    <ItemTemplate> 
     <h2 class="sf_listTitle"><asp:Literal ID="listTitle" runat="server"></asp:Literal></h2> 

     <p class="sf_controlListItems"> 
      <a id="expandAll" runat="server"> 
       <asp:Literal ID="Literal1" runat="server" Text="<%$Resources:ExpandAll %>"></asp:Literal> 
      </a> 
      <a id="collapseAll" runat="server" style="display:none;"> 
       <asp:Literal ID="Literal2" runat="server" Text="<%$Resources:CollapseAll %>"></asp:Literal> 
      </a> 
     </p> 

     <ul class="sf_expandableList" id="expandableList" runat="server"> 
      <asp:Repeater ID="listItems" runat="server"> 
       <HeaderTemplate> 
       </HeaderTemplate> 
       <ItemTemplate> 
        <li> 
         <h1 id="headlineContainer" runat="server" class="sf_listItemTitle"> 
          <a id="headline" runat="server" title="<%$Resources:ClickToExpand %>"></a> 
         </h1> 
         <div id="contentContainer" runat="server" class="sf_listItemBody" style="display:none;"> 
          <asp:Literal ID="content" runat="server"></asp:Literal> 
         </div> 
        </li> 
       </ItemTemplate> 
       <FooterTemplate> 
       </FooterTemplate> 
      </asp:Repeater> 
     </ul> 
    </ItemTemplate> 
</asp:Repeater> 

私が興味を持ってリピータが第二のリピータ、listItemsです。私のコードビハインドでは、私は直接listItemsを呼び出して、その内部のコントロールを見ることはできません。私はlist.DataBindingの内部制御をつかむしようとした方法(?多分私は別のイベントを使用する必要があります):

void lists_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    var oRepeater = (Repeater) lists.FindControl("listItems"); 
} 

が、これはnullとして起動します。誰も私に何かのポインタ/私はlistItemsリピーターにアクセスするために何が必要なのヒントを与えることができます、それは子供のコントロールですか?

ありがとうございます!

答えて

3
lists 

所属にその行を変更する必要があります。

試してください: -

void lists_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 


    if (e.Item.ItemType == ListItemType.AlternatingItem 
     || e.Item.ItemType == ListItemType.Item) 
    { 
     Repeater oRepeater = (Repeater)e.Item.FindControl("listItems"); 

     // And to get the stuff inside. 
     foreach (RepeaterItem myItem in oRepeater.Items) 
     { 
      if (myItem.Item.ItemType == ListItemType.AlternatingItem 
       || myItem.Item.ItemType == ListItemType.Item) 
      { 
      Literal myContent = (Literal)myItem.FindControl("content"); 

      // Do Something Good! 
      myContent.Text = "Huzzah!"; 

      } 
     } 
    } 
} 

そして、あなたはDavidPの役に立つ洗練を組み込むために編集された:)

良いことがあります。

+0

ありがとう、素晴らしい作品:D – Anders

+0

probsはありません。 ASP .NETのコントロール階層は、いったんそれを知ると美しいです:) –

1

あなたがリピータ自体に直接ではなく、各RepeaterItemに

var oRepeater = (Repeater) e.Item.FindControl("listItems"); 
+0

ありがとう、私は完全にハハを忘れてしまった。だから私はこのoRepeaterを取得すると、どのように制御リテラルを取得するのですか? – Anders

+0

私は今あなたの返信で覆われていると思うでしょう:) –

+0

Andersでは、属性OnItemDataBinding = "listItems_ItemDataBound"をlistItemsリピータタグに追加できます。すべてのアイテムを繰り返し処理する必要はありません。 –

0

もうすぐです!あなたのイベントハンドラの中で、あなたが扱っている行の種類をRepeaterItemEventArgsで確認してください。子リピーターは、(Alt)Item行でのみ使用でき、ヘッダーまたはフッターでは使用できません。私の推測では、それはヘッダーに爆発しているということです。

関連する問題