我的问题是这样的,我有一个datagrid表。里面放了某班学生的成绩如下:学号,姓名,语文,数学
0001  s1     90   89
0002  s2     98   99
0003  s3     78   90
0004  s4     89   67
........
现在想在datagrid表的页脚放上统计值。如下:学号,姓名,语文,数学
0001  s1     90   89
0002  s2     98   99
0003  s3     78   90
0004  s4     89   67
........
单科总分:  sum1  sum2
单科平均分:avr1  avr2
单科优秀率:yx1   yx2
单科及格率:jg1   jg2
请高手指点一二???谢谢!
.......

解决方案 »

  1.   

    原来做过的是用js实现的:通过js脚本统计出数据然后加到datagrid(客户端对应table)行下.
    当然服务器端通过对datagrid的数据源比如dataset、datatable ImportRow 统计DataRow 也可以,里面的统计方式要涉及到DataTable的Compute方法,查看相关帮助文档
      

  2.   

    首先统计指定列的数据总和
    DataGrid控件的ItemDataBound事件
    if(e.Item.ItemIndex>=0)
    {
      Sum+=int.Parse(e.Item.Cell[3].Text);
    }
    else if(e.Item.ItemType==ListItemType.Footer)
    {
     e.Item.Cell[0].Text="总和为:";sum.ToString();
     e.Item.Cell[1].Text=sum.ToString();
     e.Item.Cell[2].Text="平均值为:";
     e.Item.Cell[3].Text=((int)(sum/dgAddSumOnFooter.Item.Count)).ToString();
    }这样你看明白了吧!!
      

  3.   

    加统计值首先设定datagrid的showfooter为true,然后循环求值并加和。然后可以做平均或者什么的。
     int count=0;
     for (int i=0;i<ds.Tables[0].Rows.Count;i++)
     {
      //求总分
      count+=int.Parse(ds.Tables[0].Rows[i]["Score"].ToString());
     }
      //求均分
     int nAv=count/ds.Tables[0].Rows.Count;
      //轮询,把需要加统计值的都加上。
     foreach(DataGridItem dgi in DataGrid1.Controls[0].Controls)
     {
     if(dgi.ItemType==ListItemType.Footer)
      dgi.Cells[6].Text="平均:"+nAv.ToString();
     }
    详细可以下载收听MSDN WEBCAST《DataGrid最佳实践》(邵志东主讲),有专门介绍。
      

  4.   

    protected System.Web.UI.WebControls.DataGrid DataGrid1;         /// <summary>         /// 数据来源         /// </summary>
             DataSet CreateDataSource() 
             {
                  DataTable dt = new DataTable();
                  DataRow dr;
                dt.Columns.Add(new DataColumn("名称", typeof(string)));
                  dt.Columns.Add(new DataColumn("Value1", typeof(Int32)));
                  dt.Columns.Add(new DataColumn("Value2", typeof(Int32)));
                  dt.Columns.Add(new DataColumn("Value3", typeof(Int32)));
                  dt.Columns.Add(new DataColumn("Value4", typeof(Int32)));
                  for (int i = 0; i < 10; i++) 
                  {
                       dr = dt.NewRow();
                    dr[0] = i.ToString()+"名称";
                       dr[1] = i;
                       dr[2] = i+1;
                       dr[3] = i+2;
                       dr[4] = i+3;
                       dt.Rows.Add(dr);
                  }
                    DataSet MyData=new DataSet();
                  MyData.Tables.Add(dt);
                  return MyData;
             }
             private void Page_Load(object sender, System.EventArgs e)
             {
                  // 在此处放置用户代码以初始化页面
                  DataSet MyData=CreateDataSource();
    //            DataGrid1.DataSource= MyData;
    //            DataGrid1.DataBind();
                  DataTable MyTable=new DataTable();
                  DataColumn myColum;   
                  foreach( DataColumn  NowDataColumn in MyData.Tables[0].Columns)
                 {
                       myColum=new  DataColumn();
                       myColum.DataType=NowDataColumn.DataType;
                       myColum.ColumnName=NowDataColumn.ColumnName;
                       MyTable.Columns.Add(myColum);
                  }
                  myColum=new  DataColumn();
                  myColum.DataType=System.Type.GetType("System.Int32");
                  myColum.ColumnName="每行合计";
                  MyTable.Columns.Add(myColum);
                  DataRow  AcountRow;    
                  int DataColumns=MyData.Tables[0].Columns.Count;
                 foreach( DataRow  NowRow in  MyData.Tables[0].Rows)
                  {
                       AcountRow=MyTable.NewRow();
                       AcountRow.ItemArray=NowRow.ItemArray;
                       //每行合计
                       GetRowAccount(AcountRow,1,5,DataColumns);
                       MyTable.Rows.Add(AcountRow);
                  }
                  //生成的合计
                  AcountRow=MyTable.NewRow();
                  AcountRow[0]="竖列合计";    
                  for(int count=1;count<MyTable.Columns.Count;count++)
                       foreach (DataRow NowRow in  MyTable.Rows)
                       {
                           if(!AcountRow.IsNull(count))
                           {
                                if (!AcountRow.IsNull(count) )
                                     AcountRow[count]= Convert.ToInt32(AcountRow[count])+Convert.ToInt32(NowRow[count]);
                           }
                           else   AcountRow[count]=NowRow[count];;
                  }
                  MyTable.Rows.Add(AcountRow);
                  DataGrid1.DataSource=MyTable;
                  DataGrid1.DataBind();
             }
      

  5.   

    在ItemDataBound事件中写:
    protected int total;
    public void DataGrid1_ItemDataBound(object sender,DataGridItemEventArgs e)
            {
                if ((e.Item.ItemType == ListItemType.Item)||(e.Item.ItemType == ListItemType.AlternatingItem))
                {
                    total+= Convert.ToInt32(e.Item.Cells[1].Text.ToString());
                }
                if (e.Item.ItemType == ListItemType.Footer)
                {
                    e.Item.Cells[1].Text = total.ToString();
                }
            }
      

  6.   

    if (e.Item.ItemType == ListItemType.Footer)
                {
                        for (int i = 0; i < 2; i++)
                        {
                            e.Item.Cells.RemoveAt(1);
                        }
                        e.Item.Cells[0].Text = "总分";
                        // 单元格对齐方式
                        e.Item.Cells[0].HorizontalAlign = HorizontalAlign.Right;
                        // 要合并的单元格
                        e.Item.Cells[0].ColumnSpan = 3;
                        e.Item.Cells[1].Text= 计算出的总分;
                }
      

  7.   

    我是在HeaderRow中用的一个模板列添加一个label叫sum然后添加事件
        protected void GridView1_DataBound(object sender, EventArgs e)
        {
            if(dataset.Tables[0].Rows.Count > 0)
            ((Label)GridView1.HeaderRow.FindControl("sum")).Text = dataset.Tables[0].Compute("sum(timeslice)","true").ToString();
        }
    dataset.Tables[0].Compute的方法可以采用计算公式进行数据计算,比较通用.