使用 DataTable 的嵌套中继器 Asp.net
Nested Repeater Using DataTable Asp.net
问题是当我将 dt1 用作 rpt2.DataSource(嵌套中继器源)时,程序运行良好,但当我将 dt2 用作源(并相应地使 Eval() 发生变化)时,输出仅为 First中继器.
dt2 的输出=>
1 公羊
2 个处理器
3 张显卡
我对 dt1 进行更改时的输出=>
1 公羊
1
2
3
2 个处理器
1
2
3
3 张显卡
1
2
3
<body>
<form id="form1" runat="server">
<div>
<asp:Repeater ID="my_repeater1" runat="server" OnItemDataBound="my_repeater1_ItemDataBound">
<ItemTemplate>
<asp:Label Text='<%#Eval("ID")%>' ID="my_text1" runat="server" />
<asp:Label Text='<%#Eval("CATEGORY")%>' ID="my_text2" runat="server" />
<br />
<asp:Repeater runat="server" ID="my_repeater2">
<ItemTemplate>
<asp:Label Text='<%#Eval("ITEMS")%>' ID="lbl1" runat="server" />
<br />
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
</div>
</form>
public partial class WebForm1 : System.Web.UI.Page
{
DataTable dt1 = new DataTable();
DataTable dt2 = new DataTable();
DataTable dt3 = new DataTable();
protected void Page_Load(object sender, EventArgs e)
{
dt1.Columns.Add("ID");
dt1.Columns.Add("CATEGORY");
dt1.Rows.Add("1", "Rams");
dt1.Rows.Add("2", "Processors");
dt1.Rows.Add("3", "GraphicCards");
my_repeater1.DataSource = dt1;
my_repeater1.DataBind();
dt2.Columns.Add("ID");
dt2.Columns.Add("ITEMS");
dt2.Rows.Add("1", "DDR1");
dt2.Rows.Add("2", "DDR2");
dt2.Rows.Add("3", "DDR3");
}
protected void my_repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
Repeater rpt2 = (Repeater)e.Item.FindControl("my_repeater2");
rpt2.DataSource = dt2;
rpt2.DataBind();
}
}
执行 my_repeater1.DataBind()
时,.NET 将开始构建 my_repeater1。对于添加到 my_repeater1 的每一行,都会调用 my_repeater1_ItemDataBound
。并且由于您使用 dt2 作为嵌套 Repeater 的源,您将不会获得任何数据,因为 dt2 尚未填充数据。这只会在 my_repeater1 的构建完成后发生在您的示例中。
问题是当我将 dt1 用作 rpt2.DataSource(嵌套中继器源)时,程序运行良好,但当我将 dt2 用作源(并相应地使 Eval() 发生变化)时,输出仅为 First中继器.
dt2 的输出=>
1 公羊
2 个处理器
3 张显卡
我对 dt1 进行更改时的输出=>
1 公羊
1
2
3
2 个处理器
1
2
3
3 张显卡
1
2
3
<body>
<form id="form1" runat="server">
<div>
<asp:Repeater ID="my_repeater1" runat="server" OnItemDataBound="my_repeater1_ItemDataBound">
<ItemTemplate>
<asp:Label Text='<%#Eval("ID")%>' ID="my_text1" runat="server" />
<asp:Label Text='<%#Eval("CATEGORY")%>' ID="my_text2" runat="server" />
<br />
<asp:Repeater runat="server" ID="my_repeater2">
<ItemTemplate>
<asp:Label Text='<%#Eval("ITEMS")%>' ID="lbl1" runat="server" />
<br />
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
</div>
</form>
public partial class WebForm1 : System.Web.UI.Page
{
DataTable dt1 = new DataTable();
DataTable dt2 = new DataTable();
DataTable dt3 = new DataTable();
protected void Page_Load(object sender, EventArgs e)
{
dt1.Columns.Add("ID");
dt1.Columns.Add("CATEGORY");
dt1.Rows.Add("1", "Rams");
dt1.Rows.Add("2", "Processors");
dt1.Rows.Add("3", "GraphicCards");
my_repeater1.DataSource = dt1;
my_repeater1.DataBind();
dt2.Columns.Add("ID");
dt2.Columns.Add("ITEMS");
dt2.Rows.Add("1", "DDR1");
dt2.Rows.Add("2", "DDR2");
dt2.Rows.Add("3", "DDR3");
}
protected void my_repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
Repeater rpt2 = (Repeater)e.Item.FindControl("my_repeater2");
rpt2.DataSource = dt2;
rpt2.DataBind();
}
}
执行 my_repeater1.DataBind()
时,.NET 将开始构建 my_repeater1。对于添加到 my_repeater1 的每一行,都会调用 my_repeater1_ItemDataBound
。并且由于您使用 dt2 作为嵌套 Repeater 的源,您将不会获得任何数据,因为 dt2 尚未填充数据。这只会在 my_repeater1 的构建完成后发生在您的示例中。