none
设置了showfooter后,求和函数tot()没反应 RRS feed

  • 问题

  • 做了一个简单的GridView批量更新界面,并添加了每列求和的功能(showfooter设置为true),写了一个按列求和函数tot();   我把tot();放在Page_Load中可以用,但是放在button_Click 中就没反应了!不知道这是怎么回事,该怎么修改!

    下面是我全部的后台代码,请帮忙看看  3Q

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class ReceivableTable_ReceivableManage3 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
           tot();
        }
    
        protected void tot()
        {
            int total = 0;
            foreach (GridViewRow row in GridView_Search.Rows)
            {
                total += Convert.ToInt32((row.FindControl("Label_PropertyIDR") as Label).Text);
            }
    
    
            GridView_Search.FooterRow.Cells[1].Text = total.ToString();//“索引”代表GridView的列的序号,从0开始表示第一列……第N列的序号是N-1
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < GridView_Search.Rows.Count; i++)
            {
    
                GridViewRow row = GridView_Search.Rows[i];
    
                SqlDataSource_Search.UpdateParameters[0].DefaultValue = ((Label)row.Cells[0].FindControl("Label_ReceivableID")).Text;
                SqlDataSource_Search.UpdateParameters[1].DefaultValue = ((Label)row.Cells[1].FindControl("Label_PropertyIDR")).Text;
    
                SqlDataSource_Search.UpdateParameters[2].DefaultValue = ((TextBox)row.Cells[0].FindControl("TextBox_PropertyCityR")).Text;
    
                SqlDataSource_Search.UpdateParameters[3].DefaultValue = ((TextBox)row.Cells[1].FindControl("TextBox_PropertyRoadR")).Text;
    
                SqlDataSource_Search.UpdateParameters[4].DefaultValue = ((TextBox)row.Cells[1].FindControl("TextBox_PropertyAddressR")).Text;
    
                SqlDataSource_Search.UpdateParameters[5].DefaultValue = ((TextBox)row.Cells[1].FindControl("TextBox_PropertyCRAR")).Text;
    
                SqlDataSource_Search.UpdateParameters[6].DefaultValue = ((TextBox)row.Cells[1].FindControl("TextBox_LeaseDateFromR")).Text;
    
                SqlDataSource_Search.UpdateParameters[7].DefaultValue = GridView_Search.DataKeys[i].Value.ToString();
    
                SqlDataSource_Search.Update();
                
            }
    
            tot();
            
        }
    
    
    }
    


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2012年4月18日 2:38

答案

  • 建議寫在RowDataBound事件,像是下列的程式碼。

    protected void dgSummary_RowDataBound(object sender, GridViewRowEventArgs e)
            {
               
                try
                {
    
                 if (e.Row.RowType == DataControlRowType.DataRow)
                    {
                        ColumnTotal += Convert.ToDecimal(DataBinder.Eval(e.Row.DataItem, "Amount"));
                                                             
                    }
                    else if (e.Row.RowType == DataControlRowType.Footer)
                    {
                        e.Row.Cells[6].Text = "Total Rs:";
                        // for the Footer, display the running totals
                        e.Row.Cells[8].Text = ColumnTotal.ToString();
                        e.Row.Cells[8].HorizontalAlign = HorizontalAlign.Right;
    
                   
                        e.Row.Font.Bold = true;
                    }
                    
    
                }
                catch (Exception ex)
                {        
                }
            }

    參考資料:http://www.dotnetspider.com/resources/5228-Sum-In-Gridview-Footer.aspx


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年4月18日 3:06
  • 1)如你之前和我的解释,请直接放到Page_Load或者GridView_DataBound事件中。

    2)尝试这样修改(把TerryChuang的代码的变量定义挪到外边,不然每次执行这个事件,变量都被初始化一次,所以总是1)。

    把变量定义在“类级别”的范畴:

    public class WebForm1 ……
    {
       decimal ColumnTotal = 0.0d;
    }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年4月19日 4:39

全部回复

  • 不是代码问题。那是因为当你点击Button事件之后整个页面重新刷新,GridView还要重新绑定一次。在按下按钮瞬间GridView并未来得及绑定,自然GridView不可能存在行,因此tot函数的foreach循环无法执行。应该放到Load或者是GridView_DataBound中。


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年4月18日 3:05
  • 建議寫在RowDataBound事件,像是下列的程式碼。

    protected void dgSummary_RowDataBound(object sender, GridViewRowEventArgs e)
            {
               
                try
                {
    
                 if (e.Row.RowType == DataControlRowType.DataRow)
                    {
                        ColumnTotal += Convert.ToDecimal(DataBinder.Eval(e.Row.DataItem, "Amount"));
                                                             
                    }
                    else if (e.Row.RowType == DataControlRowType.Footer)
                    {
                        e.Row.Cells[6].Text = "Total Rs:";
                        // for the Footer, display the running totals
                        e.Row.Cells[8].Text = ColumnTotal.ToString();
                        e.Row.Cells[8].HorizontalAlign = HorizontalAlign.Right;
    
                   
                        e.Row.Font.Bold = true;
                    }
                    
    
                }
                catch (Exception ex)
                {        
                }
            }

    參考資料:http://www.dotnetspider.com/resources/5228-Sum-In-Gridview-Footer.aspx


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年4月18日 3:06
  • 尝试了您提供的代码!有两个问题不明,有空请指点一下!谢谢!

    问题1:

    ColumnTotal += Convert.ToDecimal(DataBinder.Eval(e.Row.DataItem, "Amount"));

    这一句中的 Amount 是指的什么呢? 是指的数据库中需要合计的列名么?是否我只要相应的把Amount 改成 我自己的数据列的名字就可以了?

    问题2:ColumnTotal 这个变量如何声明?系统提示要先声明这个变量,于是我在try上面加上了 Decimal ColumnTotal=0; 但是 不行啊! 得到的结果等于 0,!!!

     try
                { Decimal ColumnTotal=0;
    


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2012年4月18日 9:12
  • 問題一、你說的沒錯,Amount是你資料表的數據列名字,改成你自己的數據列名字即可。

    問題二、有關ColumnTotal的宣告,你可以宣告在if (e.Row.RowType == DataControlRowType.DataRow)的上面。


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年4月18日 9:24
  • 谢谢您的解答!   关于第二个问题我尝试了,结果还是不对,合计的结果永远等于1,因为 decimal ColumnTotal=1的缘故,我知道这就是错的原因,可是不知道怎么改

    protected void dgSummary_RowDataBound(object sender, GridViewRowEventArgs e) { decimal ColumnTotal=1; try {

    //decimal ColumnTotal=1; 放在这里还是1

                  if (e.Row.RowType == DataControlRowType.DataRow)
                    {
                        ColumnTotal += Convert.ToDecimal(DataBinder.Eval(e.Row.DataItem, "Amount"));
                                                             
                    }
                    else if (e.Row.RowType == DataControlRowType.Footer)
                    {
                        e.Row.Cells[6].Text = "Total Rs:";
                        // for the Footer, display the running totals
                        e.Row.Cells[8].Text = ColumnTotal.ToString();
                        e.Row.Cells[8].HorizontalAlign = HorizontalAlign.Right;
    
                   
                        e.Row.Font.Bold = true;
                    }
                    
    
                }
                catch (Exception ex)
                {        
                }
            }


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!


    2012年4月19日 3:59
  • 1)如你之前和我的解释,请直接放到Page_Load或者GridView_DataBound事件中。

    2)尝试这样修改(把TerryChuang的代码的变量定义挪到外边,不然每次执行这个事件,变量都被初始化一次,所以总是1)。

    把变量定义在“类级别”的范畴:

    public class WebForm1 ……
    {
       decimal ColumnTotal = 0.0d;
    }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年4月19日 4:39