2016-08-04 2 views
0

Хорошо, так что это, вероятно, очень простая проблема, с которой у меня невероятно трудное время, когда вы придумали решение.ASP.NET Сумма столбца, возвращенного из хранимой процедуры в LINQ

У меня есть простое веб-приложение ASP.Net, которое отправляет и извлекает капитальные проекты в/из базы данных SQL Server на основе свойства, выбранного пользователем.

В этом проекте у меня есть несколько хранимых процедур, построенных в SQL Server, которые обрабатывают передачу данных из приложения в базу данных. Я использую LINQ в проекте ASP.NET для подключения к хранимым процедурам.

В частности, у меня есть ASP.NET Repeater, который является заполненным списком всех представленных проектов капиталов для выбранной компании. Мой код достаточно прост:

Ретранслятор:

<asp:Repeater ID="rptProjects" runat="server" OnItemCommand="rptProjects_ItemCommand"> 
    <HeaderTemplate> 
     <table style="table-layout:auto; width:100%"> 
      <tr> 
       <td style="width:2%"><b>Item #</b></td> 
       <td style="width:2%"><b>Priority</b> </td> 
       <td style="width:10%"><b>Project Name</b></td> 
       <td style="width:20%"><b>Description</b></td> 
       <td style="width:4%"><b>Reason</b></td> 
       <td style="width:3%"><b>Category</b></td> 
       <td style="width:2%"><b>Asset Age</b></td> 
       <td style="width:3%"><b>Est. Useful Life</b></td> 
       <td style="width:2%"><b>Qty</b></td> 
       <td style="width:2%"><b>Unit Type</b></td> 
       <td style="width:3%"><b>Unit Cost</b></td> 
       <td style="width:3%"><b>Total Budget</b></td> 
       <td style="width:20%"><b>Owner Comments</b></td> 
       <td style="width:3%">&nbsp</td> 
       <td style="width:3%">&nbsp</td> 
      </tr> 
     </table> 
    </HeaderTemplate> 
    <ItemTemplate> 
     <table style="width:100%"> 
      <tr> 
       <td style="width:2%">R#</td> 
       <td style="width:2%"><%#Eval("Priority") %> </td> 
       <td style="width:10%"><%#Eval("ProjectName") %></td> 
       <td style="width:20%"><%#Eval("Description") %> </td> 
       <td style="width:4%"><%#Eval("Reason") %> </td> 
       <td style="width:3%"><%#Eval("Category") %></td> 
       <td style="width:2%"><%#Eval("AssetAge") %> </td> 
       <td style="width:3%"><%#Eval("AssetUsefulLife") %></td> 
       <td style="width:2%"><%#Eval("Quantity") %> </td> 
       <td style="width:2%"><%#Eval("UnitType") %></td> 
       <td style="width:3%"><%#Eval("UnitCost", "{0:C0}") %></td> 
       <td style="width:3%"><%#Eval("TotalAmount", "{0:C0}") %></td> 
       <td style="width:20%"><%#Eval("OwnerNotes") %></td> 
       <td style="width:3%"> 
        <asp:Button ID="btnDelete" runat="server" Text="X" 
          ToolTip="Delete the selected project." 
          CommandName="Delete" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "ItemCode") %>' 
          CausesValidation="False" /> 
       </td> 
       <td style="width:3%"> 
        <asp:Button ID="btnUpdate" runat="server" Text="Edit" 
          ToolTip="Update the selected project." 
          CommandName="Update" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "ItemCode") %>' 
          CausesValidation="False" /> 
       </td> 
      </tr> 
     </table> 
    </ItemTemplate> 
</asp:Repeater> 

Ретранслятор заполняется очень просто в C# с помощью DataContext, который выполняет хранимую процедуру, которая возвращает все проекты по недвижимости.

C# код:

//Load any projects submitted for the property 
using(var dataContext = new CAPEXDataConnDataContext()) 
{ 
    rptProjects.DataSource = dataContext.web_CAPEXProjectsByCompany(Session["PropertyNumber"].ToString()); 
    rptProjects.DataBind(); 
} 

Это приводит к хорошим, простым ретранслятором:

ASP Repeater

Мой вопрос: в контексте текущего кода, как я могу легко суммировать общая колонка бюджета в FooterTemplate в ретрансляторе?

Я не уверен, что это необходимо или нет, но я основываюсь на платформе .NET 4.5.

ответ

0

Рассматривая свой код, я надеюсь, что вы можете сделать, указав направление;

  1. Добавить FooterTemplate и Label внутри него

  2. Реализовать ItemDataBound на Repeater управления

  3. Использование ниже условия суммы значений

protected void repeater_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     if (e.Item.ItemType == ListItemType.Footer) 
     { 
      //Write your logic to retrieve each value from the collection  
      //YourRepeaterName.Items and add it to Label at the end 
     } 
    } 
0

Определите глобальную переменную в C# и суммируйте ее в обработчике ItemDataBound. Что-то вроде этого.

decimal grandTotal = 0; 
//... 
using(var dataContext = new CAPEXDataConnDataContext()) 
{ 
    rptProjects.DataSource = dataContext.web_CAPEXProjectsByCompany(Session["PropertyNumber"].ToString()); 
    grandTotal = 0; 
    rptProjects.DataBind(); 
} 
//... 
protected void rptProjects_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
     grandTotal += (decimal)e.Item.DataItem["TotalAmount"]; 
    } 
    if(e.Item.ItemType == ListItemType.Footer) 
    { 
     ((Literal)e.Item.FindControl("grandTotal")).Text = grandTotal.ToString("C"); 
    } 
} 
+0

Спасибо, на линии 'GrandTotal + = (десятичное) e.Item.DataItem [«TotalAmount»];' Я получаю сообщение об ошибке, которое утверждает 'Невозможно применить индексирование с [] к выражению типа" object'' –

+0

Изменить на '(десятичный) ((DataRowView) e.Item.DataItem) [" ... "]' или какой бы тип вашего 'dataSource' не возвращался. –

+0

Теперь это: 'невозможно передать объект типа '_2016Capex.web_CAPEXProjectsByCompanyResult' для ввода 'System.Data.DowRowView'.' –