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 は現在の Class の Tasks 結合で見つかったすべての 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();
    }
}

内側のリピーターのデータ ソースとして使用する必要があるデータ項目のプロパティは、GroupLINQ ステートメントでグループ化するのと同じだと思いますが、それを変更する必要があるかもしれません...

于 2013-09-24T06:48:43.927 に答える
0

私の知る限り、LINQ はデータ バインディングにおいて何の役割も果たしません。あなたが言及したLINQクエリは、必要に応じてデータを見つけて入力する可能性があります。しかし、リピーターをネストしたので、「rptrParent.DataBind();」最も外側のリピーターのみをバインドします。「rptrParent」のItemDataBoundイベントを記述し、LINQクエリから取得したグループに割り当てられた子リピーターコントロールを見つける必要があると思います。

これがあなたを助けることを願っています。

于 2013-09-24T06:51:36.957 に答える