如何将外层Repeater的Students属性作为嵌套Repeater的数据源?
问题与解决:ASP.NET WebForms嵌套Repeater绑定关联数据
问题背景
原本使用Repeater控件展示学生列表,现在需要将Repeater的数据源从Student[]改为Teacher[],并为每位教师展示其名下所有学生。
对象结构
Teacher{ string teacherName Student[] students } Student{ string studentName }
疑问与尝试
已知需要使用嵌套Repeater,但不清楚如何将外层Repeater的students属性作为内层Repeater的数据源,尝试的伪代码如下:
<asp:Repeater runat="server" DataSourceID="Teachers"> <ItemTemplate> <Eval(teacherName)> <asp:Repeater runat="server" DataSourceID="<Eval(students)"> <ItemTemplate> <Eval(studentName)> </ItemTemplate> </asp:Repeater> </ItemTemplate> </asp:Repeater>
解决方法
方法1:通过ItemDataBound事件绑定(后端控制)
- 前端代码调整:给内层Repeater设置ID,移除错误的
DataSourceID绑定:
<asp:Repeater ID="rptTeachers" runat="server" OnItemDataBound="rptTeachers_ItemDataBound"> <ItemTemplate> <h3><%# Eval("teacherName") %></h3> <asp:Repeater ID="rptStudents" runat="server"> <ItemTemplate> <p><%# Eval("studentName") %></p> </ItemTemplate> </asp:Repeater> </ItemTemplate> </asp:Repeater>
- 后端代码实现:在外层Repeater的
ItemDataBound事件中,获取当前教师对象并绑定内层Repeater:
protected void rptTeachers_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { Teacher teacher = (Teacher)e.Item.DataItem; Repeater rptStudents = (Repeater)e.Item.FindControl("rptStudents"); rptStudents.DataSource = teacher.students; rptStudents.DataBind(); } }
方法2:直接通过数据绑定表达式赋值(更简洁)
无需后台事件,直接在前端通过绑定表达式将外层的students属性赋值给内层Repeater的DataSource,注意使用单引号包裹表达式避免冲突:
<asp:Repeater ID="rptTeachers" runat="server" DataSourceID="Teachers"> <ItemTemplate> <h3><%# Eval("teacherName") %></h3> <asp:Repeater ID="rptStudents" runat="server" DataSource='<%# Eval("students") %>'> <ItemTemplate> <p><%# Eval("studentName") %></p> </ItemTemplate> </asp:Repeater> </ItemTemplate> </asp:Repeater>
内容的提问来源于stack exchange,提问作者Blizz
相关产品推荐
相关产品推荐

