我是使用WinForm编程
我有table T1
学好,姓名,成绩
 001,   L,90
 002,   A,80
 003,   S,89
 004,   F,78
一个Form中只有一个DataGrid
我想显示T1中的所有数据,再加一个成绩汇总的列(总成绩)所有成绩的列比如在DataGrid中
学好,姓名,成绩
 001,   L,90
 002,   A,80
 003,   S,89
 004,   F,78
总成绩(所有成绩和)或者在78的下一个单元格中显示所有成绩的和也可以
谢谢!

解决方案 »

  1.   

    通过DataTable.Compute来实现统计,置于显示,就比较灵活的,要么加入到DataTable中,要么单独去画。
      

  2.   

    <asp:DataGrid id="dgAddSumOnFooter" style="Z-INDEX: 101; LEFT: 8px; POSITION: absolute; TOP: 48px"
    runat="server" Height="20px" BorderColor="#3366CC" BorderStyle="None" BorderWidth="1px" BackColor="White"
    CellPadding="4" ToolTip="计算第一列的总和及平均值" ShowFooter="True" AutoGenerateColumns="False" Width="464px">
    <SelectedItemStyle Font-Bold="True" ForeColor="#CCFF99" BackColor="#009999"></SelectedItemStyle>
    <ItemStyle ForeColor="#003399" BackColor="White"></ItemStyle>
    <HeaderStyle Font-Bold="True" ForeColor="#CCCCFF" BackColor="#003399"></HeaderStyle>
    <FooterStyle ForeColor="#003399" BackColor="#99CCCC"></FooterStyle>
    <Columns>
    <asp:BoundColumn DataField="LastName" HeaderText="姓名"></asp:BoundColumn>
    <asp:BoundColumn DataField="FirstName" HeaderText="姓"></asp:BoundColumn>
    <asp:BoundColumn DataField="TitleOfCourtesy" HeaderText="称谓"></asp:BoundColumn>
    <asp:BoundColumn DataField="Extension" HeaderText="示例数字"></asp:BoundColumn>
    </Columns>
    <PagerStyle HorizontalAlign="Left" ForeColor="#003399" BackColor="#99CCCC" Mode="NumericPages"></PagerStyle>
    </asp:DataGrid>private int sum = 0;
    private void dgAddSumOnFooter_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
    {
    if (e.Item.ItemIndex >= 0)
    {
    //取指定列的数据总和
    sum += int.Parse(e.Item.Cells[3].Text);
    }
    //在页脚中添加指定列的总和和平均值
    else if (e.Item.ItemType == ListItemType.Footer)
    {
    e.Item.Cells[0].Text = "总和为: ";sum.ToString();
    e.Item.Cells[1].Text = sum.ToString();
    e.Item.Cells[2].Text = "平均值为:";
    e.Item.Cells[3].Text = ((int)(sum / dgAddSumOnFooter.Items.Count)).ToString();
    } }
      

  3.   

    我有个办法
    供参考!!
    我的方法只是为解决问题。
    呵呵。。
    SQL实现。
    可能因为本人写SQL写的太多了。所以一切都能在Sql中搞定的就在 SQL中搞定。select 学好,姓名,成绩
    from  table T1
    union 
    ( select ''as 学好 ,'' as 姓名 ,sum(成绩) as 成绩
       from table T1

    如果你把汇总列放在后边可以把学号弄一个固定的足够大的常量。
    需要排序可以再嵌套一个查询。。在SQL不是很复杂的情况下我一般都这么解决。
    方便。效率高。
    本人做过较长时间报表,所以喜欢这样。供参考!
      

  4.   

    to hoodlum521() hoho,原来也是一个喜欢SQL的啊不过还有一个COMPUTE子句可以使用,只不过出来两个Table而已,第二个table就是汇总了SELECT 学好, 姓名, 成绩 FROM AP_STUDENTS COMPUTE SUM(成绩)
      

  5.   

    还UNION什么,直接在Group By子句中加个With Rollup不就完了,不过这样的网格不能用列头排序,
    最好是把Grouping一块读到DataSet中,然后,让Grouping在排序时取得优先权.
      

  6.   

    e.Item.Cells[2].Text = SumDT.Compute("Sum(成绩)","true").ToString();
    SumDT是你的数据表
      

  7.   

    To:Reeezak高手,COMPUTE 没有用过。马上测试!!!
    呵呵
      

  8.   

    前面两位讲的Compute和UION在SQLDataAdapter中不能用的
      

  9.   

    使用SQL比较方便,我经常这样使用:
    select 学好,姓名,成绩
    from  table T1
    union all
    select '','汇总:',sum(成绩) as 成绩
    from table T1
     
     效果如下:
     学号  姓名 分数
     001,   L,90
     002,   A,80
     003,   S,89
     004,   F,78
           汇总:337
      

  10.   

    上述实现方法最好直接在SQL SERVER中去做.
      

  11.   

    楼上的SQL测试了吗?
    好像有点问题。
    union好像要求两个数据集的字段名和顺序要一模一样。
    不让会报错吧!!
      

  12.   

    对于只读的SQL Server数据可以使用如下方法取得数据:SELECT CASE WHEN (GROUPING(字段1) = 1) THEN '合计'
                ELSE ISNULL(字段1, '')
           END AS 字段1,
           CASE WHEN (GROUPING(字段2) = 1) THEN '合计'
                ELSE ISNULL(字段2, '')
           END AS 字段2,
           SUM(字段3) AS 字段3的SUM
    FROM 表1
    GROUP BY 字段1, 字段2 WITH ROLLUP如果需要自已对字段排序,则需要在列中附加输出GROUPING(字段1)和GROUPING(字段2),并让他们的排序优先级总远最高,然后在网格中隐藏这两列
    ----------------------------
    以上是我回答别人贴子的答案,不过后来那个LZ说,他指的不是只读数据
    COMPUTE是一个求值方法,但不是一个显示方法,这个问题的难度不在于求值,而在于显示
      

  13.   

    用DataTable.Computeprivate void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
    {
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
    }
    else if(e.Item.ItemType == ListItemType.Footer )
    {
    e.Item.Cells[0].Text="统计";
    e.Item.Cells[2].Text = SumDT.Compute("Sum(reguser)","reguser>0").ToString();
    e.Item.Cells[3].Text = SumDT.Compute("Sum(deluser)","true").ToString();
    e.Item.Cells[4].Text = SumDT.Compute("Sum(delcnt)","true").ToString();
    e.Item.Cells[6].Text = SumDT.Compute("Sum(subuser)","true").ToString();
    e.Item.Cells[7].Text = SumDT.Compute("Sum(subcnt)","true").ToString();
    e.Item.Cells[9].Text = SumDT.Compute("Sum(canuser)","true").ToString();
    } }SumDT是一个和数据源一样的数据表!
    ---------------------------------------------
    好象这个问题,有很多人问过了!:)
      

  14.   

    WinForm和Web有点区别,WinForm没有机械式的交互,然后产生响应,或这种概念很模糊
    我也没用过你说的Compute(对于Web来说,我只懂一点静态的HTML,虽然我也自己写过ASP和ASP.Net的东西,反正都是糊弄客户的,达到用户的目的完事),我不太清楚Compute会不会因为源数据的更改,而随时更新,但DataSet的确有这种随时更新的机制,就是可以用一个Table和另一个与其有关系的Table进行Child运算,而且算的结果,是100%实时的(比如Child在数据网格中,可以自由编辑,编辑完成后,父行的数据立即改变),但在网格中显示就非常麻烦了,一般首先想到的,一定是从网格派生,然后自绘,但我在实践中,发现这种难度非常非常大,而且有时自己需要求的可能有几十个这种类型的数据表,所以后来,我干脆放弃了想法,而是去用两条线,就是彻底区分了只读数据和非只读数据,对于非只读数据,我的汇总方法,是在Grid外汇总.