我是使用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的下一个单元格中显示所有成绩的和也可以
谢谢!
我有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的下一个单元格中显示所有成绩的和也可以
谢谢!
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();
} }
供参考!!
我的方法只是为解决问题。
呵呵。。
SQL实现。
可能因为本人写SQL写的太多了。所以一切都能在Sql中搞定的就在 SQL中搞定。select 学好,姓名,成绩
from table T1
union
( select ''as 学好 ,'' as 姓名 ,sum(成绩) as 成绩
from table T1
)
如果你把汇总列放在后边可以把学号弄一个固定的足够大的常量。
需要排序可以再嵌套一个查询。。在SQL不是很复杂的情况下我一般都这么解决。
方便。效率高。
本人做过较长时间报表,所以喜欢这样。供参考!
最好是把Grouping一块读到DataSet中,然后,让Grouping在排序时取得优先权.
SumDT是你的数据表
呵呵
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
好像有点问题。
union好像要求两个数据集的字段名和顺序要一模一样。
不让会报错吧!!
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是一个求值方法,但不是一个显示方法,这个问题的难度不在于求值,而在于显示
{
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是一个和数据源一样的数据表!
---------------------------------------------
好象这个问题,有很多人问过了!:)
我也没用过你说的Compute(对于Web来说,我只懂一点静态的HTML,虽然我也自己写过ASP和ASP.Net的东西,反正都是糊弄客户的,达到用户的目的完事),我不太清楚Compute会不会因为源数据的更改,而随时更新,但DataSet的确有这种随时更新的机制,就是可以用一个Table和另一个与其有关系的Table进行Child运算,而且算的结果,是100%实时的(比如Child在数据网格中,可以自由编辑,编辑完成后,父行的数据立即改变),但在网格中显示就非常麻烦了,一般首先想到的,一定是从网格派生,然后自绘,但我在实践中,发现这种难度非常非常大,而且有时自己需要求的可能有几十个这种类型的数据表,所以后来,我干脆放弃了想法,而是去用两条线,就是彻底区分了只读数据和非只读数据,对于非只读数据,我的汇总方法,是在Grid外汇总.