【问题标题】:How to create category and list in one query with Linq如何使用 Linq 在一个查询中创建类别和列表
【发布时间】:2010-06-21 06:32:36
【问题描述】:

我想使用 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>

这显然行不通。 如何在 DataList 项的中继器中使用 Children 集合?

【问题讨论】:

    标签: asp.net linq-to-sql


    【解决方案1】:

    我用我的模式表尝试了这个,它工作正常。诀窍是使用 Datalist 的 ItemDataBound 事件。请参阅下面的标记。注意我使用的是具有教师实体集合的 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();
            }
        }
    

    【讨论】:

    • 是的,这也是我基本上想出的解决方案。事实上,它几乎是一样的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多