所以我已经尝试过远距离搜索,但无法使我的嵌套转发器正常工作。
<asp:Repeater ID="rptrParent" runat="server">
<ItemTemplate>
<dl class="StudentTasksList">
<dt><%# Eval("ClassCode") %></dt>
<asp:Repeater ID="rptrChild" runat="server">
<ItemTemplate>
<dd><%# Eval("Title") %></dd>
</ItemTemplate>
</asp:Repeater>
</dl>
</ItemTemplate>
</asp:Repeater>
C#代码
private void ListTasks()
{
using (StudentContext syndb = new StudentContext())
{
using (TaskContext dbdb = new TaskContext())
{
// Iterate through each active Class for the current Student finding any tasks not archived for this year
var ClassTasks = (from c in syndb.GetClasses()
where c.Students.Select(y => y.StudentID).Contains(LoggedInUserID)
join t in dbdb.Tasks on c.ClassCode equals t.ClassCode
where !t.Archive.HasValue || t.Archive.HasValue && t.Archive.Value && t.DueDate.Value.Year == DateTime.Now.Year
group c by c.ClassCode);
rptrParent.DataSource = ClassTasks;
rptrParent.DataBind();
}
}
}
因此,ClassCode来自所选学生的GetClasses()方法,而Title是在当前类的Tasks连接中找到的任何标题的名称。我需要的结果是每个ClassCode下具有任何相关任务标题的学生的班级列表。我尝试了几种不同的方法,所以这可能不是我想要做的最好的样本。如果有人可以向我展示一个LINQ C#连接linq查询的例子,我会很高兴填充一个嵌套的转发器,因为我找不到足够的东西可以解决这个问题。
如果班级没有任何任务,我也想知道如何填补N / A,但我不会推得好运。
答案 0 :(得分:1)
要填充内部转发器,您必须处理父转发器的ItemDataBound事件,如下所示:
<asp:Repeater ID="rptrParent" runat="server" OnItemDataBound="rptrParent_ItemDataBound">
在
背后的代码中protected void rptrParent_ItemDataBound(object sender, RepeaterItemEventArgs e) {
RepeaterItem item = e.Item;
if ((item.ItemType == ListItemType.Item) || (item.ItemType == ListItemType.AlternatingItem)) {
Repeater rptrChild = (Repeater)item.FindControl("rptrChild");
rptrChild.DataSource = DataBinder.Eval(item.DataItem, "Group");
rptrChild.DataBind();
}
}
我猜你在LINQ语句中进行分组时,你需要用作内部转发器的数据源的数据项的属性是Group
,但是你可能需要改变它...
答案 1 :(得分:0)
据我所知,LINQ不会在数据绑定中发挥任何作用。您提到的LINQ查询查找并可能根据需要填充数据。但是你已经将Repeater禁止了“rptrParent.DataBind();”将只绑定最外面的中继器。我认为您必须为“rptrParent”编写ItemDataBound事件,并找到子转发器控件,将其与从LINQ查询中获得的组分配。
希望这会对你有所帮助。