在转发器中显示数据

时间:2013-10-22 12:19:43

标签: c# asp.net linq

我有一个数据表,列出了代理商,联系人和组,最终结果将通过列表绑定到转发器控件。到目前为止,我能够提取我需要的信息,但却无法获得代理商和联系人的独特价值。有重复的代理商以及具有一个或多个组的联系人。

它应该类似于这种结构:

Agency1 
   Jenny    |  Basketball, Dance
   Bill     | Football, Ballet
Agency2
   Archie   |  Soccer, Band

到目前为止,我有这个:

var groups = dt.AsEnumerable()
.GroupBy(r => new
{
    Agency = r.Field<string>(("Agency")),
   //Contact = r.Field<string>("POC") ,
   //Groups = r.Field<string>("POC_Name")
});


List<alist> agencyAdd = new List<alist>();
foreach (var agencyContactGroup in groups)
{
    agencyAdd.Add(new alist()
    {

      Agency = agencyContactGroup.Key.Agency,
      Contact = string.Join("<br>", agencyContactGroup.Select(r => r.Field<string>("POC")))
              + string.Join(",",  agencyContactGroup.Select(g => g.Field<string>("POC_Name")))
    });
}

并在.aspx方面:

<asp:Repeater runat="server" ID="AgencyRepeater">
<HeaderTemplate> <h2>Agency:</h2> </HeaderTemplate>
<ItemTemplate>
    <table>
        <tr>
          <td><h3><b><%# DataBinder.Eval(Container.DataItem, "Agency") %></b></h3></td>
        </tr>
        <tr>
          <td>
             <b><%# DataBinder.Eval(Container.DataItem, "Contact") %></b>
             <b><%# DataBinder.Eval(Container.DataItem, "Groups") %></b>
          </td>
        </tr>
    </table>   
</ItemTemplate>
</asp:Repeater>

有人能指出我正确的方向吗?感谢。

2 个答案:

答案 0 :(得分:1)

使用linq group by,使用嵌套的repeater / listview控件。您可以使用linq IGrouping Key属性来显示组标题,这些项可以是任何类型。以下是如何将其应用于您的方案的示例。希望这会有所帮助。

Groupings.DataSource = agencyAdd.GroupBy(a=> a.Agency.Name);
Groupings.Databind();

<asp:ListView ID="Groupings" runat="server" ViewStateMode="Disabled" EnableViewState="false">
    <LayoutTemplate>
        <Table>
              <tbody>
            <asp:PlaceHolder runat="server" ID="ItemPlaceHolder" />
              </tbody>
        </Table>
    </LayoutTemplate>
    <ItemTemplate>
        <!-- group header -->
        <tr><td colspan="3"><%# Eval("Key") %></td></tr> 

        <!-- group items -->
        <asp:ListView ID="GroupItems" runat="server" DataSource='<%# Container.DataItem %>' ViewStateMode="Disabled" EnableViewState="false">
        <LayoutTemplate>
           <asp:PlaceHolder runat="server" ID="ItemPlaceHolder" />
        </LayoutTemplate>
            <ItemTemplate>
              <tr>
                <td> </td>
                </td><%# DataBinder.Eval(Container.DataItem, "Contact") %></td>
                </td><%# DataBinder.Eval(Container.DataItem, "Groups") %></td>
              </tr>
            </ItemTemplate>
    </ItemTemplate>     
</asp:ListView> 

答案 1 :(得分:0)

分组查询应该是这样的:

dt.AsEnumerable()
.GroupBy(r => r.Field<string>("Agency"))
.Select(g => 
    new AgencyDto { 
          Agency = g.Key,
          Contacts = g.GroupBy(r1 => r1.Field<string>("POC"))
            .Select(g1 => 
              new ContactDto { 
                    Contact = g1.Key, 
                    Groups = string.Join(",", g1.Select(r2 => r2.Field<string>("POC_Name")))
                  })
        })

因此首先按Agency进行分组,并且在这些组中有Contacts组,其Groups连接为逗号分隔的字符串。

我假设您要创建AgencyDtoContactDto类型。