【问题标题】:Calculating total underneath a gridview在gridview下计算总计
【发布时间】:2021-03-20 08:27:04
【问题描述】:

我有一个网格视图,旁边有一个数量和计算价格。当我在 Gridview 中更改数量时,价格会立即发生变化。我想在 gridview 之外显示总价。我在网格视图之外显示总价,但是当单个商品的数量和价格发生变化时,价格不会动态变化。下面是我想要的图像。我想在价格发生变化时立即显示和计算 $560。

下面是我的gridview代码:

<asp:GridView ID="grdShoppingCart" runat="server" AutoGenerateColumns="false" class="ui-responsive table-stroke ss-table ui-search-result-table" GridLines="None" OnRowDataBound="grdShoppingCart_RowDataBound"  >
                <Columns>
                    <asp:BoundField DataField="item" HeaderText="Item" HeaderStyle-Font-Bold="true" ItemStyle-HorizontalAlign="Left" HeaderStyle-HorizontalAlign="Left" ItemStyle-Width="250px" ControlStyle-CssClass="ss-row"    />
                    <asp:TemplateField HeaderText="Description" HeaderStyle-Font-Bold="true" HeaderStyle-HorizontalAlign="Left" ItemStyle-HorizontalAlign="Left" ItemStyle-Width="300px" ControlStyle-CssClass="ss-row"    >
                        <ItemTemplate>
                            <asp:Label ID="lblDesc" runat="server" Text='<%# Eval("child") %>' /><br />
                            &nbsp;Requested By: &nbsp;<asp:Label ID="lblDesc1" runat="server" Text='<%# Eval("RequestedBy") %>' />
                        </ItemTemplate>

                    </asp:TemplateField>
                       <asp:TemplateField HeaderText="Quantity" HeaderStyle-HorizontalAlign="Left" ItemStyle-HorizontalAlign="Left"  ControlStyle-CssClass="ss-row"  >
                        <ItemTemplate>
                                    <asp:TextBox Width="45px" TextMode="Number" ID="txtQuantity"  Text='<%#Eval("Quantity") %>'    runat="server" AutoPostBack="true" OnTextChanged="txtQuantity_TextChanged" ></asp:TextBox>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="Price" HeaderStyle-HorizontalAlign="right" ItemStyle-HorizontalAlign="Right" ItemStyle-Width="100px" ControlStyle-CssClass="ss-row" >
                        <ItemTemplate>
                            <asp:Label ID="lblPrice" runat="server"></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                     <asp:TemplateField ShowHeader="False" HeaderStyle-HorizontalAlign="center" ItemStyle-HorizontalAlign="center" ItemStyle-Width="150px" ControlStyle-CssClass="ss-row" >
                        <ItemTemplate>
                             <asp:ImageButton CommandArgument='<%# Eval("recordId") %>' ID="imgbtnDelete" runat="server" ImageUrl="~/Images/delete1.png"  CommandName="Delete"   ToolTip="Click To Dletee" AlternateText="Click To Dletee"/>                            
                      </ItemTemplate>
                        </asp:TemplateField>

                </Columns>

            </asp:GridView>

这是我在后面的代码中尝试做的以显示总数:

我在我的类中声明了这个变量,并将价格文本框的值放在 rowDatabound 的总变量中

public string total;
protected void grdShoppingCart_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                Label lbl = (e.Row.FindControl("lblPrice") as Label);
                TextBox tbq = (e.Row.FindControl("txtQuantity") as TextBox);
                
                if(tbq.Text !="")
                {
                    lbl.Text = (Convert.ToInt32(tbq.Text) * 28).ToString();
                    total= lbl.Text.ToString(); 
                }
                    
            }
        }

在 aspx 页面中,我这样写:

Total: <%=total %> 

下面是改变价格和数量的代码:

 protected void txtQuantity_TextChanged(object sender, EventArgs e)
        {
            TextBox changeTextbox = sender as TextBox;
            GridViewRow row = (GridViewRow)changeTextbox.NamingContainer;
            TextBox tbq = (row.FindControl("txtQuantity") as TextBox);
            Label lblPrice = (row.FindControl("lblPrice") as Label);
            lblPrice.Text = (Convert.ToInt32(tbq.Text) * 28).ToString();
     }

任何帮助都将受到高度赞赏。

【问题讨论】:

  • 你能分享一下改变gridview中价格和数量的代码吗?
  • 你需要改代码,目前total只保留最后一行价格,试试这个方法techaid24.com/subtotal-and-grand-total-in-gridview
  • 刚刚添加了更改价格和数量的代码
  • @code_b,Total 不是网格视图的一部分。它在网格视图之外。
  • 你只能对数据绑定事件 grdShoppingCart_DataBind 进行总计算,看看那个例子,它让你足够了解如何连接这些事件

标签: c# asp.net gridview


【解决方案1】:

您的代码很接近。请记住,数据网格将在往返过程中持续存在(回发),更重要的是,如果您仅在 FIRST 回发 = false 时绑定数据网格?

然后网格将显示,但行数据绑定事件不会重新触发(因此没有总数)

所以,我们假设在页面返回时我们重新绑定。

现在你有了这个代码:

total= lbl.Text.ToString(); 

你需要

total = total + lbl.Text.ToString()

或者,当然是这样的:

total += lbl.Text.ToString()

或者更多,你想要一个最终的总数,然后

total += lbl.Text * tbq.Text

但是,你所拥有的应该可以工作。

编辑:

我现在看到的问题是总价格没有立即更新。但是我们至少应该在页面重新刷新时获得最终的总工作量。

如果您希望在编辑时更新总数?然后最容易的是在您的文本更改事件中重新计算总数。所以说这样的代码:

因此,您可以先拥有现有代码,然后在同一文本更改事件中添加此循环:

protected void TextBoxE_TextChanged(object sender, EventArgs e)
{

// total the grid
sTotal = 0;
GridViewRow gvr;

foreach (var gvr in GridView1.Rows)
{
    TextBox txtV = gvr.FindControl("lblPrice");
    if (txtV.Text != "")
        sTotal += lblprice.Text;
}
}

因此,在您更改的文本中,您可以(并且需要)在更新一行后重新循环这些行。所以需要运行上面的循环。请记住,行数据绑定事件会针对数据绑定上的每一行触发。如果您在回发时执行 gridview 数据绑定,那么您当然会丢失网格中的值。但是,我敢打赌,您没有进行数据绑定,因此一个简单的循环重新计算金额应该可以正常工作。

这里的主要问题是您遗漏了问题的主旨。那是什么?当然,为什么您首先忽略了汇总的地方。由于你的那部分是错误的(或者至少看起来是错误的),那么我的帖子首先解决了这个问题,你需要 +=。如果您的 intitail 总负载有效,那么您应该发布该代码及其工作原理 - 因为您发布的内容将不起作用。

所以现在我们弄清楚了为什么我的帖子解决了首次渲染时缺少总计的问题。

一旦你开始工作(并且你应该已经发布了它是如何工作的),那么只有这样我们才能解决文本更改事件。如上所示,重新循环并汇总所有行很容易,因为您的更改将持续存在并存在于该数据中 - 所以在您的文本更改后 - 运行/添加/执行上述循环以重新汇总。

【讨论】:

  • 我所拥有的东西不起作用。它不会立即计算总数。
  • 每一行都会触发行数据绑定事件 - 因此您将单行值分配给总计 - 您必须在此处使用总计 = 总计 +“某个值”。呈现网格时,该事件会逐行触发。如何从行数据绑定中的单行值中获取总计?您需要添加每一行的总数。查看我的编辑
  • 您不能对字符串进行算术运算,这是错误的,您需要在执行任何算术运算之前将其转换为数字。 total += lbl.Text * tbq.Text
  • JSON 数据、XML 数据、来自 Web 表单控件的值?你猜怎么了?您“触摸”的所有内容都是文本格式。随着网络土地的兴起?您今天接触的所有数据附近都不是强类型的,而是简单的文本格式,而不是一些二进制“实数”或“整数”格式。 Web 表单上的文本框实际上是纯文本。所以,事实上,你为处理来自网络的数据而编写的任何代码实际上都是文本格式。我 100% 同意应该引入一些强制转换——但 .net 确实会强制转换此类数据——而且人们一直都在这样做。您的全部示例作为文本工作。
  • 所以,在发帖人终于把 = 改成了 += 之后?然后另一个问题是网格位于更新面板内 - 但文本框不在。那么,一旦这些问题得到解决?然后代码将按照我发布的方式工作。海报忽略的 OHTER 巨大的 WHOPPER 是在文本更改事件中 - 你必须在每一行上运行整个循环 - 海报再次忽略了我的建议。既然海报被棍棒击打在头上 - 海报现在有了一个可行的解决方案。所以这里的最后一个难题是网格在更新面板中,而文本框不在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 2018-12-26
  • 2018-02-07
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
相关资源
最近更新 更多