Как создать категорию и список в одном запросе с Linq - PullRequest
0 голосов
/ 20 июня 2010

Я хочу создать что-то подобное, используя DataList и разметку Flow:

|-----------------------|
|        Title          |
|-----------------------|
| [x] Title             |
| [x] Title             |
| ...                   |
-------------------------

У меня есть таблица (смоделированная в Linq2Sql) Foo, в которой есть эти поля

int id;
int? parentId;
string title;
Foo Parent;
EntitySet<Foo> Children;

Теперь, когда есть нулевой родитель, это означает, что это категория верхнего уровня, а если у родителя есть значение, это часть списка категорий.

Я создал DataList и использовал LinqDataSource с запросом, который выглядит следующим образом:

<asp:LinqDataSource ID="LinqDataSource1" runat="server" 
    ContextTypeName="MyNameSpace.FooDataContext" 
    Select="new (Title, Children)" TableName="Foo" 
    Where="ParentID = NULL">
</asp:LinqDataSource>

<asp:DataList ID="FooList" runat="server" DataSourceID="LinqDataSource1" 
  BorderColor="Black" BorderWidth="1px" RepeatLayout="Flow">
  <ItemTemplate>
    <asp:Label ID="TitleLabel" runat="server" Text='<%# Eval("Title") %>' />
    <br />
    <asp:Repeater ID="Repeater1" runat="server" DataSourceID="<%# Eval("Children") %>">
        <ItemTemplate>
            <asp:CheckBox ID="Checks" Text="<%# Eval("Title") %>" runat="server" />
        </ItemTemplate>
    </asp:Repeater>
  </ItemTemplate>
</asp:DataList>

Это, очевидно, не работает. Как я могу использовать коллекцию Children в повторителе элемента DataList?

1 Ответ

1 голос
/ 21 июня 2010

Я попробовал это с моими таблицами схемы, и это работает нормально. Хитрость заключается в том, чтобы использовать событие ItemDataBound разметки Datalist.See ниже. Обратите внимание, что я использую сущность Scool, которая имеет коллекцию сущностей Учителя

<asp:DataList ID="DataList1" runat="server" DataKeyField="id" 
    DataSourceID="LinqDataSource1" Width="246px" 
    onitemdatabound="DataList1_ItemDataBound">
    <ItemTemplate>
        name:
        <asp:Label ID="nameLabel" runat="server" Text='<%# Eval("name") %>' />
        <div style="border:solid blue 3px;padding:2px;">
       <asp:Repeater ID="rptteachers" runat="server"  >
       <ItemTemplate>
    <asp:Label ID="kllj" runat="server" Text='<%# Eval("name") %>'  ></asp:Label>
    <asp:Label ID="Label1" runat="server" Text='<%# Eval("quals") %>'  ></asp:Label> 
     </ItemTemplate>
       </asp:Repeater>
       </div>
    </ItemTemplate>
</asp:DataList>

Затем добавьте следующее к коду.

protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e)
    {

        Repeater r = e.Item.FindControl("rptteachers") as Repeater;
        if (r == null) return;
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType ==        ListItemType.AlternatingItem)
        {
            school sc = e.Item.DataItem as school;
            if (sc == null) return;
            r.DataSource = sc.Teachers;
            r.DataBind();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...