.net 在GridView中添加列的总和

x33g5p2x  于 2023-08-08  发布在  .NET
关注(0)|答案(2)|浏览(101)

无法在GridView页脚中添加列的总和。GridView单元格编号为9,我希望在页脚中显示总和。我乘以价格与数量,并显示在'ItemTotal'列,这是工作。

<ItemTemplate>
         <asp:Label ID="Label1" runat="server" Text='<%# ((Convert.ToInt32(Eval("Price")))*(Convert.ToInt32(Eval("Quantity"))))%>'>></asp:Label>
 </ItemTemplate>

字符串

我的代码如下所示
方法一

我已经创建了一个方法来添加列值仍然没有得到计算。

private void calculateSum()
        {
            int grandtotal = 0;
            foreach (GridViewRow row in GridView1.Rows)
            {
                string cellValue = row.Cells[9].Text;
                int parsedValue;
                if (int.TryParse(cellValue, out parsedValue))
                {
                    grandtotal += parsedValue;
                }
            }

            GridView1.FooterRow.Cells[9].Text = grandtotal.ToString();
        }
protected void Page_Load(object sender, EventArgs e)
        {
            calculateSum();
        }

的数据
enter image description here

我也试过方法2但收到错误信息

private void calculateSum()
        {
            Int32 grandtotal = 0;
            foreach (GridViewRow row in GridView1.Rows)
            {
                grandtotal = grandtotal + Convert.ToInt32(row.Cells[9].Text); 
            }
            GridView1.FooterRow.Cells[9].Text = grandtotal.ToString();
        }

接收错误信息:输入字符串的格式不正确。enter image description here

结论:在方法1中,我没有得到任何错误,但在方法2中。我需要在GridView中添加列的总和列9页脚
我应该使用哪种方法以及在这里修复什么。
如果你能帮我找到正确的密码我会很感激的

cgyqldqp

cgyqldqp1#

好的,问题是模板化列在GridView单元格集合中不以“.text”值存在。
因此,尽管cells集合将存在,但对于任何模板化控件,您都不能使用cells集合(.text)来获取该值。
那么,网格视图中的典型设计模式(假设模板化列中有一些标签)是什么呢?
你可以像这样使用find控件:

decimal MyTotal = 0;
        foreach (GridViewRow gRow in GridView1.Rows)
        {
            Label lblTotalT = (Label)gRow.FindControl("Label1");
            MyTotal += Convert.ToDecimal(lblTotalT.Text);
        }

字符串
因此,对数据字段列使用cells[],对模板化列使用上述“find control”。
然而,我经常发现最好是汇总数据源,而不是尝试将数据的UI显示用作某些数据库。一个“大”的原因是,你经常有格式化的数字,如货币,或任何东西。这意味着显示带有$或货币符号的数据会导致混乱的转换问题。
因此,尝试根据GridView的DATA生成总计,而不要使用GridView的“UI”显示。
所以,这个例子网格:

<asp:GridView ID="GridView1" runat="server"
    AutoGenerateColumns="False" DataKeyNames="ID" CssClass="table"
    ShowFooter="true">
    <Columns>
        <asp:BoundField DataField="FirstName" HeaderText="FirstName" />
        <asp:BoundField DataField="LastName" HeaderText="LastName" />
        <asp:BoundField DataField="HotelName" HeaderText="HotelName" />
        <asp:BoundField DataField="Description" HeaderText="Description" />
        <asp:BoundField DataField="Nights" HeaderText="Nights" ItemStyle-HorizontalAlign="Center" />
        <asp:BoundField DataField="Price" HeaderText="Price" DataFormatString="{0:c2}"
            ItemStyle-HorizontalAlign="Right" />

        <asp:TemplateField HeaderText="Total" ItemStyle-HorizontalAlign="Right">
            <ItemTemplate>
                <asp:Label ID="lblTotal" runat="server"
                    Text='<%# string.Format("{0:c2}", Eval("MyTotal")) %>'></asp:Label>
            </ItemTemplate>
            <FooterTemplate>
                <asp:Label ID="lblMyTotal" runat="server" Text="x">
                </asp:Label>
            </FooterTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>


我们要加载的代码是这样的:

void LoadGrid()
    {
        DataTable rstData;
        string strSQL = 
            @"SELECT * FROM tblHotels WHERE Nights > 0
            ORDER BY HotelName";

        rstData = General.MyRst(strSQL);

        DataColumn MyCol = new DataColumn("MyTotal", typeof(decimal));
        MyCol.Expression = "[Nights] * [Price]";
        rstData.Columns.Add(MyCol);

        GridView1.DataSource = rstData;
        GridView1.DataBind();

        // set up the footing total.
        decimal gTotal = 0;
        foreach (DataRow dr in rstData.Rows)
            gTotal += Convert.ToDecimal(dr["MyTotal"]);

        Label lblTotal = (Label)GridView1.FooterRow.FindControl("lblMyTotal");
        lblTotal.Text = String.Format("{0:C2}", gTotal);

    }


结果是这样的:
x1c 0d1x的数据
现在,即使您不采用上述合计数据的“概念”,也会导致我将列数据自由地显示为格式化的货币值?(这一点都不好!!).
您仍然使用每行的.findcontrol,因为要设置或获取的值当然不是cells[]值,而是模板化的列,这需要使用给定行的.FindControl方法。
注意上面使用的第二个技巧。很少有人意识到可以在加载数据表后添加其他列,并且这些列可以具有计算值表达式。因此,我不必运行代码来乘以每行总数的夜数x夜率。
因此,如果可能的话,尝试处理您提供给GridView的数据,而不是处理GridView的“UI”呈现,因为通常情况下,诸如“”之类的东西或诸如此类呈现的HTML标记的货币格式之类的东西会使合计HTML数据变得相当困难。

zwghvu4y

zwghvu4y2#

它需要确保9是正确的索引值。请检查您的代码:

private void calculateSum()
        {
            string grandtotal = "";
            foreach (GridViewRow row in GridView1.Rows)
            {
                grandtotal += row.Cells[9].Text + ";"; 
            }
            GridView1.FooterRow.Cells[9].Text = grandtotal;
        }

字符串
在评论中提供反馈。

相关问题