0

所以我已经尝试并广泛搜索,但无法让我的嵌套中继器正常工作。

<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 是在当前班级的任务连接中找到的任何标题的名称。我需要的结果是每个 ClassCode 下具有任何相关任务标题的学生的课程列表。我已经尝试了几种不同的方法,所以这可能不是我想要做的最好的例子。如果有人可以向我展示一个填充嵌套中继器的连接 linq 查询的 LINQ C# 示例,我会很棒,因为我找不到任何足够体面的东西来解决这个问题。

如果班级没有任何任务,我也想知道如何在适当的位置填充 N/A,但我不会碰运气。

4

2 回答 2

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();
    }
}

我猜您需要用作内部中继器的数据源的数据项的属性与Group您在 LINQ 语句中分组时一样,但也许您需要更改它...

于 2013-09-24T06:48:43.927 回答
0

据我所知,LINQ 在数据绑定中没有任何作用。您提到的 LINQ 查询看起来可以找到并可以根据需要填充数据。但是您已经将中继器嵌套为“rptrParent.DataBind();” 只会绑定最外面的中继器。我认为您必须为“rptrParent”编写 ItemDataBound 事件,并找到子中继器控件将其分配给您从 LINQ 查询中获得的组。

希望这会帮助你。

于 2013-09-24T06:51:36.957 回答