リピーターの中にリピーターがいます。親リピーターが、Datatble
を含む列を持つ にバインドされDatatable
ている場所。
子リピーターを親リピーターのデータ行のデータテーブル列にバインドしたい
これは可能ですか?私は次のaspx
ようにファイルで直接これを行うことができると考えていました:
DataSource="<%# DataBinder.Eval(Container.DataItem, "Products")%>"
しかし、うまくいかないようです。
リピーターの中にリピーターがいます。親リピーターが、Datatble
を含む列を持つ にバインドされDatatable
ている場所。
子リピーターを親リピーターのデータ行のデータテーブル列にバインドしたい
これは可能ですか?私は次のaspx
ようにファイルで直接これを行うことができると考えていました:
DataSource="<%# DataBinder.Eval(Container.DataItem, "Products")%>"
しかし、うまくいかないようです。
親リピーターでメソッドを OnItemDataBound イベントにアタッチし、そのメソッドでネストされたリピーターを見つけてデータ バインドします。
例 (.aspx):
<asp:Repeater ID="ParentRepeater" runat="server" OnItemDataBound="ItemBound">
<ItemTemplate>
<!-- Repeated data -->
<asp:Repeater ID="ChildRepeater" runat="server">
<ItemTemplate>
<!-- Nested repeated data -->
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
例 (.cs):
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ParentRepeater.DataSource = ...;
ParentRepeater.DataBind();
}
}
protected void ItemBound(object sender, RepeaterItemEventArgs args)
{
if (args.Item.ItemType == ListItemType.Item || args.Item.ItemType == ListItemType.AlternatingItem)
{
Repeater childRepeater = (Repeater)args.Item.FindControl("ChildRepeater");
childRepeater.DataSource = ...;
childRepeater.DataBind();
}
}
子リピーター自体に DataBinding イベントを追加します。
<asp:Repeater ID="parentRepeater" runat="server">
<asp:Repeater ID="childRepeater" runat="server"
OnDataBinding="childRepeater_DataBinding" />
</asp:Repeater>
次に、それを実装します。
protected void childRepeater_DataBinding(object sender, System.EventArgs e)
{
Repeater rep = (Repeater)(sender);
int someIdFromParentDataSource = (int)(Eval("ParentID"));
// Assuming you have a function call `GetSomeData` that will return
// the data you want to bind to your child repeater.
rep.DataSource = GetSomeData(int);
rep.DataBind();
}
ItemDataBound
テンプレート内のコントロールまたはアイテムを削除する必要がある場合に、それを使用する親コントロールでコードを探すことを心配する必要がないように、レベルではなくコントロール レベルで行うことを好みます。それはすべて、彼がコントロールすることでローカライズされます。さらに、FindControl
.
将来的にコントロールを置き換えたい場合は、それを削除するだけで、すべて自己完結型であるため、コードは引き続き機能します。を使用するItemDataBound
と、コードは引き続きコンパイルされますが、子コントロールに依存しているため、実行時にクラッシュまたは予期しない動作が発生します。
方法は次のとおりです。
DataSource='<%# ((System.Data.DataRowView)Container.DataItem)[3] %>'
したがって、ネストされたリピーターの子テーブル/データソースを保持する親テーブルの列がわかっている場合は、これを aspx ファイルに直接配置できます。
その必要がある場合は、通常、親リピーターの ItemDataBound イベントを使用して子リピーターをバインドします。e が EventArgs パラメータの場合、e.Item.FindControl() を介して子リピーターにアクセスし、e.Item.DataItem を介してデータにアクセスできます。
Repeater1 OnItemDataBound イベント、次に FindControl Repeater2。コード ビハインドは、ネストされた Repeater2! を検出しません。FindControl("Repeater2") を使用する必要があります。
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.DataItem != null)
{
MemberView dataRow = (MemberView)e.Item.DataItem;
var cat = MemberPresenter.getMemberID(dataRow.memID);
Repeater rp2 = (Repeater)e.Item.FindControl("Repeater2");
rp2.DataSource = cat;
rp2.DataBind();
}
}
これを行う方法の例を次に示します: ネストされたリピーター制御の記事
protected void MainRepeater_ItemDataBound(object sender, RepeaterItemEventArgs args)
{
if (args.Item.ItemType == ListItemType.Item || args.Item.ItemType == ListItemType.AlternatingItem)
{
Repeater childRepeater = (Repeater)args.Item.FindControl("ChildRepeater");
DataTable innerTable= ((DataRowView)args.Item.DataItem)["InnerTableColumnName"] as DataTable;
childRepeater.DataSource = tasksDetails;
childRepeater.DataBind();
}
}