【问题标题】:ASP.NET Sum a column returned from stored procedure in LINQASP.NET Sum 从 LINQ 中的存储过程返回的列
【发布时间】:2016-08-04 15:38:18
【问题描述】:

好的,所以这可能是一个非常简单的问题,我很难想出一个解决方案。

我有一个简单的 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>

在 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();
}

这会产生一个漂亮、简单的中继器:

我的问题是:在当前代码的上下文中,我怎样才能轻松地将总预算列汇总到转发器中的FooterTemplate

我不确定这是否必要,但我正在构建 .NET 4.5 框架。

【问题讨论】:

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


    【解决方案1】:

    看你的代码,希望你能提供方向;

    1. 在里面添加FooterTemplateLabel

    2. Repeater控件上实现ItemDataBound

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

    【讨论】:

      【解决方案2】:

      在 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");
         }
      }
      

      【讨论】:

      • 谢谢,在线grandTotal +=(decimal)e.Item.DataItem["TotalAmount"]; 我收到一条错误消息,指出Cannot apply indexing with [] to an expression of type 'object'
      • 更改为(decimal)((DataRowView)e.Item.DataItem)["..."] 或您的dataSource 返回的任何类型。
      • 现在这个:unable to cast object of type '_2016Capex.web_CAPEXProjectsByCompanyResult' to type 'System.Data.DataRowView'.
      • 所以使用(decimal)((_2016Capex.web_CAPEXProjectsByCompanyResult)e.Item.DataItem)["..."]
      猜你喜欢
      • 1970-01-01
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多