2013-04-04 4 views
0

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

<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 

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

enter image description here

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

ответ

0

Вы можете использовать вложенную 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

+0

Невозможно привести объект типа «System. Data.DataRowView 'для ввода' CatalogItem '. – Gaurav

+0

Как я уже сказал в своем ответе, я не знаю, какой DataSource вы используете, поэтому я использовал «CatalogItem» в качестве заполнителя. Вам нужно, чтобы я изменил код, чтобы он соответствовал вашему точному DataSource, или вы сами можете понять это? –

+0

@Gaurav: Вы получили шанс проверить код? Я приложил немало усилий в этот ответ, и я хотел бы узнать, работает ли оно на вас. Благодаря! –

 Смежные вопросы

  • Нет связанных вопросов^_^