ASP.NET总结从LINQ中的存储过程返回的列

时间:2016-08-04 15:38:18

标签: c# asp.net sql-server linq

好的,所以这可能是一个非常简单的问题,我有一个难以置信的困难时间提出解决方案。

我有一个简单的ASP.Net Web应用程序,它根据用户选择的属性向/从SQL Server数据库提交和检索大写项目。

在这个项目中,我有许多在SQL Server中构建的存储过程,用于处理从应用程序到数据库的数据传输。我在ASP.NET项目中使用LINQ连接到存储过程。

特别是,我有一个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>

使用dataContext在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框架。

2 个答案:

答案 0 :(得分:0)

查看您的代码,我希望您可以通过提供指导来完成;

  1. 在其中添加FooterTemplateLabel

  2. ItemDataBound控件

  3. 上实施Repeater
  4. 使用以下条件总和值

  5. 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
            }
        }
    

答案 1 :(得分: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");
   }
}