2011-10-26 7 views
2

今日はASP.Netデータバインディングで楽しい時間を過ごしています。基本的に2つのネストされたコントロールと、バインドしたい独自の内部コレクションを持つオブジェクトのコレクションがあります。 。ASP.Netバインドされたコントロール内のデータバインディング

だから、私はこのような2つのリピータ使用していると言う - >

<asp:Repeater ID="Repeater1"> 
     <ItemTemplate> 
     <asp:Label runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "HeaderText")%>'> 
     </asp:Label> 
     <asp:Repeater ID="Repeater2"> 
      <asp:Label runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "DetailText")%>'> 
      </asp:Label> 
     </asp:Repeater> 
     </ItemTemplate> 
    </asp:Repeater> 

をそして、私のオブジェクトは次のようになります。

public class parent 
    { 
     public string HeaderText {get;set;} 
     public List<child> children {get;set;} 
    } 
    public class child 
    { 
     public string DetailText {get;set;} 
    } 

どのように私は、内側のリピータを結合していますか?私は&の 'Repeater2'のデータソースをaspxのどこかに 'parent'の 'children'プロパティとしてバインドする必要があると推測していますか?

誰かが私を正しい方向に向けることができますか?

おかげ

+1

おかげで - 私は実際のaspxでデータソースを設定し、最後に: ' ' これはトリッキーなようですが、失敗した場合はバインドイベントを推奨どおりに使用します:) – Bob

答えて

1

バインドメインリピータItemDataBoundイベントでネストされたリピータ。

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemdatabound.aspx

ここでは、コントロール(FindControl)を見つけ、それに特異的に結合することができます。

それはのようになります。ListViewまたはDataList場合を使用する方が簡単かもしれません

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    Repeater innerRepeater = e.Item.FindControl("InnerRepeater1") as Repeater; 
    if (innerRepeater != null) 
    { 
     innerRepeater.DataSource = GetSomeData(); 
     innerRepeater.DataBind(); 
    } 
} 

:あなたが外リピータのItemDataboundイベントで、内側リピータを結合する

<asp:Repeater ID="Repeater1" OnItemDataBound="Repeater1_ItemDataBound"> 


void Repeater1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) { 
    Repeater Rep2 = e.Item.FindControl("Repeater2"); 
    Rep2.DataSource = //datasource here 
    Rep2.DataBind();   
}  
1

データキーを指定できるので、外部データバインドコントロールからのデータを使用して内部データバインドコントロールをバインドする必要があります。

<asp:ListView ID="ListView1" runat="server" DataKeyNames="SomeColumn" ...> 

コードビハインド:すべての答えが提案のため

protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    ListView innerList = e.Item.FindControl("InnerList1") as ListView; 
    if (innerList != null) 
    { 
     innerList.DataSource = GetSomeData((int)ListView1.DataKeys[ListView1.Items.IndexOf(e.Item)]["SomeColumn"]); 
     innerList.DataBind(); 
    } 
} 
+0

Jamesさん、ありがとうございましたが、私は実際にカスタムコントロールを使用しています - リピーターは単純な例でした:) – Bob

+0

それで私の答えはどう変わるのですか?同じ概念がそのまま適用されます。 –

関連する問題