Скрыть повторяемую строку в репитере

На самом деле я использую контроль повторителя для отображения некоторых отчетов.

 <asp:Repeater id="cdcatalog" runat="server">
<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>
<td><%#Eval("Total")%> </td>
<td><%#Eval("Price")%> </td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater> 

ниже мой sql запрос

ALTER Proc [dbo].[RP_ByCost_Code]
@Date1 datetime,
@Date2 datetime

as
select Cost_Code , Total , (Total*12) as Price from mtblLog_Book where     Vehicle_Booking_Date between @Date1 and @Date2 order BY Cost_Code

и отчет приходит как ниже формат

увидеть, что есть повторяющиеся предметы идет. Давайте возьмем ENE-Direct. Я хочу взять его только один раз для каждой строки ENE-Direct, и он должен показываться один раз для всех кодов затрат.

1 ответ

Вы можете использовать вложенный Repeater вместе с LINQ GroupBy метод для достижения этого.

Я не уверен в вашем источнике данных и как вы связываете cdcatalog повторитель, поэтому в этом примере я использую список CatalogItems. Это 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, Внутренний повторитель затем будет связан с отфильтрованным списком CatalogItems. Вот так:

    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>

Окончательный результат будет выглядеть так:

Другие вопросы по тегам