在C#中使用LINQ的简单嵌套转发器示例

时间:2013-09-24 06:35:11

标签: c# asp.net linq

所以我已经尝试过远距离搜索,但无法使我的嵌套转发器正常工作。

<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,但我不会推得好运。

2 个答案:

答案 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查询中获得的组分配。

希望这会对你有所帮助。