我在列表中有以下示例数据:
Company-----City-----State-----Salesperson
FakeCo------Test-----FL--------Jim
FakeCo------Test-----FL--------John
FakeCo------Test-----FL--------Sue
Acme--------Foo------CA--------Jane
Oscorp------Bar------NY--------Steve
Oscorp------Bar------NY--------Bob
编辑:此列表中的数据不是静态的,并且会根据查询参数定期更改。
如您所见,有三家公司为每家公司提供冗余数据和多个销售人员。我想做的是获取这些数据并以一种在aspx页面上重复一点点的方式显示它。以下是我想要完成的一个简单示例:
我尝试过使用Telerik的RadGridView和他们的RadListView,但我似乎无法做到正确。我不确定是否需要嵌套控件。我也不确定这些控件中的任何一个是否是实现我的目标的最佳方式,它们只是我想到的第一件事。
我知道这是一个模糊的问题(并且是主观的),但我正在寻找关于显示分组表格数据的最佳方式的意见。示例,链接等也会特别有用!
答案 0 :(得分:2)
尝试以下步骤。代码是不言自明的
创建两个类
// this is the original class you have
public class CompanyDetails
{
public string Company { get; set; }
public string City { get; set; }
public string State { get; set; }
public string SalesPerson { get; set; }
}
//this is to help you with the display
public class GroupedCompanyDetails
{
public string Address { get; set; }
public List<string> SalesPerson { get; set; }
}
现在DataBind下面转换后的ListView像这样
List<CompanyDetails> details = GetCompanyDetails();
IEnumerable<GroupedCompanyDetails> groupedDetails = details
.GroupBy(sp => new { sp.Company, sp.City, sp.State })
.Select(gsp => new GroupedCompanyDetails()
{
Address = String.Format("{0}<br/>{1}, {2}", gsp.Key.Company, gsp.Key.City, gsp.Key.State),
SalesPerson = gsp.Select(x => x.SalesPerson).ToList()
});
MasterLS.DataSource = groupedDetails;
MasterLS.DataBind();
支持标记将是
<asp:ListView ID="MasterLS" runat="server">
<LayoutTemplate>
<table class="salesmantable">
<tbody>
<tr id="itemPlaceholder" runat="server" />
</tbody>
</table>
</LayoutTemplate>
<ItemTemplate>
<tr>
<td><%# Eval("Address") %></td>
<td>
<asp:ListView ID="SalesmanLS" runat="server"
DataSource='<%# Eval("SalesPerson") %>'>
<ItemTemplate>
<%# Container.DataItem %><hr />
</ItemTemplate>
</asp:ListView>
</td>
</tr>
</ItemTemplate>
</asp:ListView>
此外,如果你想在第二个td内的表尝试这个标记,
<asp:ListView ID="SalesmanLS" runat="server"
DataSource='<%# Eval("SalesPerson") %>'>
<LayoutTemplate>
<table class="salesmanchildtable">
<tbody>
<tr id="itemPlaceholder" runat="server" />
</tbody>
</table>
</LayoutTemplate>
<ItemTemplate>
<tr><td><%# Container.DataItem %></td></tr>
</ItemTemplate>
</asp:ListView>
免责声明:我的ListView有点生疏。 Dunno,如果有更好的方法。现在太过MVC了;)
答案 1 :(得分:1)
您对所提供的数据所谓的非标准化数据(返回数据库理论),因此基本上有一个主 - 细节关系,如果它被标准化,将在2个不同的表中,如:< / p>
ID Company-----City-----State
1----FakeCo------Test-----FL
2----Acme--------Foo------CA
3----Oscorp------Bar------NY
Salesperson----Company ID
Jim------------1
John-----------1
Sue------------1
Jane-----------2
Steve----------3
Bob------------3
考虑到这一点,有几种方法可以根据需要显示数据,使用单个数据源(如您所拥有)或将其拆分为2个与主 - 细节关系相关的不同数据源。所以你需要寻找的是asp.net上的master-detail布局。
不一定要考虑使用单一控制方法来实现这一点,即使大多数第三方的数据绑定控件都提供了这种数据布局,例如你提到的那个,Telerik的RadGridView,这里是一些样本他们有这种布局:
http://demos.telerik.com/aspnet-ajax/grid/examples/functionality/grouping/grouping/defaultcs.aspx
http://demos.telerik.com/aspnet-ajax/grid/examples/data-binding/master-detail/defaultcs.aspx
但是,您也可以使用内置的ASP .NET控件实现此目的,并记住您始终可以使用嵌套数据控件,如:http://elpolloprogrammer.com/index.php/master-detail-gridview-in-asp-net-c/