Вы можете использовать вложенную Repeater
наряду с методом LINQ GroupBy
для достижения этой цели.
Я не уверен в вашем DataSource и как вы связываете ретранслятор cdcatalog
, поэтому в этом примере я использую Список CatalogItem
s. Это CatalogItem
класс:
public class CatalogItem
{
public string Cost_Code { get; set; }
public int Total { get; set; }
public decimal Price { get; set; }
}
Вам нужен список на уровне страницы:
List<CatalogItem> items;
В принципе, вы будете связывать внешний ретранслятор в список, который группируется по Cost_Code
. Затем внутренний ретранслятор будет привязан к отфильтрованному списку CatalogItem
с. Как так:
protected void Page_Load(object sender, EventArgs e)
{
items = new List<CatalogItem>();
items.Add(new CatalogItem() { Cost_Code = "ENE-Direct", Total = 33, Price = 196 });
items.Add(new CatalogItem() { Cost_Code = "ENE-Direct", Total = 8, Price = 96 });
items.Add(new CatalogItem() { Cost_Code = "ENE-Direct", Total = 15, Price = 1260 });
items.Add(new CatalogItem() { Cost_Code = "ENE-Direct", Total = 10, Price = 228 });
items.Add(new CatalogItem() { Cost_Code = "ENE-Direct", Total = 125, Price = 60 });
items.Add(new CatalogItem() { Cost_Code = "IND038301", Total = 10, Price = 258 });
items.Add(new CatalogItem() { Cost_Code = "IND038302", Total = 20, Price = 358 });
items.Add(new CatalogItem() { Cost_Code = "IND038303", Total = 30, Price = 458 });
items.Add(new CatalogItem() { Cost_Code = "IND038304", Total = 40, Price = 558 });
this.cdcatalog.DataSource = items.GroupBy(c => c.Cost_Code).Select(c => new CatalogItem() { Cost_Code = c.Key });
this.cdcatalog.DataBind();
}
protected void cdcatalog_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Repeater rptItems = (Repeater)e.Item.FindControl("rptItems");
CatalogItem catalogGroup = (CatalogItem)e.Item.DataItem;
rptItems.DataSource = items.Where(i => i.Cost_Code == catalogGroup.Cost_Code);
rptItems.DataBind();
}
}
код ASCX будет выглядеть следующим образом:
<asp:Repeater ID="cdcatalog" runat="server" OnItemDataBound="cdcatalog_ItemDataBound">
<HeaderTemplate>
<table border="1" width="500">
<tr>
<th>Cost Code</th>
<th>Total</th>
<th>Price</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><%#Eval("Cost_Code")%> </td>
</tr>
<asp:Repeater ID="rptItems" runat="server">
<ItemTemplate>
<tr>
<td></td>
<td><%#Eval("Total")%> </td>
<td><%#Eval("Price")%> </td>
</tr>
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
Окончательный результат будет выглядеть следующим образом:
![enter image description here](https://i.stack.imgur.com/TH5XB.png)
Невозможно привести объект типа «System. Data.DataRowView 'для ввода' CatalogItem '. – Gaurav
Как я уже сказал в своем ответе, я не знаю, какой DataSource вы используете, поэтому я использовал «CatalogItem» в качестве заполнителя. Вам нужно, чтобы я изменил код, чтобы он соответствовал вашему точному DataSource, или вы сами можете понять это? –
@Gaurav: Вы получили шанс проверить код? Я приложил немало усилий в этот ответ, и я хотел бы узнать, работает ли оно на вас. Благодаря! –