关于DataGridView的增加合计行的问题

创业码农 2008-03-24 01:54:22
问题是这样的,我需要在DataGridView中画一个或几个新的行(位于新增行之下),可是DataGridView的滚动条却没办控制它要滚动的范围,这样的话我的计算行就显示不出现(当数据太大超出Grid的显示范围的时候),我重写了DataGridViewRowCollection的GetRowCount方法,像简单的在返回的行数里加入我需要画出来的那几个计划行。
请问是不是我的办法不对?或者有更好的方法?
部分代码,如下:
// SummaryGridView, inherite from DataGridView
protected override DataGridViewRowCollection CreateRowsInstance()
{
return new SummaryDataRowCollection(this);
}
// SummaryDataRowCollection class define
public class SummaryDataRowCollection : DataGridViewRowCollection
{
private SummaryGridView grid;

public SummaryDataRowCollection(DataGridView dataGridView)
: base(dataGridView)
{
if (dataGridView is SummaryGridView) grid = dataGridView as SummaryGridView;
}

public new int GetRowCount(DataGridViewElementStates includeFilter)
{
if (grid != null)
{
return base.GetRowCount(includeFilter) + (grid.FooterData != null ? grid.FooterData.Rows.Count : 0);
}
else
{
return base.GetRowCount(includeFilter);
}
}
}
...全文
453 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
九章落地 2008-03-26
  • 打赏
  • 举报
回复
你先计算出合计行的位置,然后在datagridview底部绘制,行高控制得小一些(如20),然后在拖动滚动条的事件里刷新底部区域.

int LocX=2;
int LocY = this.Height - (this.HorizontalScrollBar.Visible ? 37 : 20);
.....
//draw caption
g.FillRectangle(myBrush1, LocX, LocY, this.RowHeadersWidth - 2, 20);
//caption's top line
g.DrawLine(pen1, new Point(LocX, LocY), new Point(this.RowHeadersWidth - 1, LocY));
// caption's left line
g.DrawLine(pen2, new Point(LocX - 1, LocY), new Point(LocX - 1, LocY + 20));
g.DrawLine(pen1, new Point(LocX, LocY), new Point(LocX, LocY + 20));

.....
创业码农 2008-03-25
  • 打赏
  • 举报
回复
to ydsunny
我是在OnPaint Event里绘制合计行,可是当记录数过多出现滚动条的时候就会出现合计行出现不全的问题了。
至于你说的第二种办法,我过去在Delphi里用过类似的,要同步绘制的东西太多,我觉得这种办法更适合做较fix的报表。
回到我提出的问题,我只是希望当GridView访问DataGridViewRowCollection的GetRowCount方法时返回我要加入绘制的行数,可当我重写了DataGridViewRowCollection的public int new GetRowCount(DataGridViewElementStates filter),这个方法不会被DataGridView调用,是不是我的写法那里有问题?我对C#不是很熟,请大家帮忙呀。
九章落地 2008-03-24
  • 打赏
  • 举报
回复
若单纯是继承DataGridView实现底部合计行.
可以通过重写OnPaint事件,在DataGridview底部手动绘制一行.这种方法除了拖动滚动条时有一点点闪之外,还是比较好的.

若要做得比较完美,可考虑做成组合控件,在DataGridView下面增加另外的控件来显示统计信息,如另一个不带标题的DataGridView,Panel等.

后一种方式比较可行!
创业码农 2008-03-24
  • 打赏
  • 举报
回复
不是这样的,我需要在用户在Grid里输入数据的时候就开始运算(Sum,Avg,Max,Min一类的统计信息),如果是在数据库里的运算我也不用去重载DataGridView了,不过谢谢你的SQL也是一种思路,只是不适合我的需求。
一品梅 2008-03-24
  • 打赏
  • 举报
回复
初始表:
原表

编号 班级 语文 数学
1 一班 80 90
2 一班 80 90
3 一班 60 90
4 三班 70 70
5 三班 80 90
6 三班 80 80
7 二班 90 80
8 二班 90 60
9 一班 80 90
结果表:
/*
班级 语文 数学
-------------- ----------- -----------
二班 90 80
二班 90 60
二班小计 180 140
三班 70 70
三班 80 90
三班 80 80
三班小计 230 240
一班 80 90
一班 80 90
一班 60 90
一班 80 90
一班小计 300 360
合计 710 740

(所影响的行数为 13 行)
*/
一品梅 2008-03-24
  • 打赏
  • 举报
回复
给你个例子:
create table tb(班级 varchar(10), 语文 int , 数学 int)
insert into tb values('一班', 80, 90 )
insert into tb values('一班', 80, 90 )
insert into tb values('一班', 60, 90 )
insert into tb values('三班', 70, 70 )
insert into tb values('三班', 80, 90 )
insert into tb values('三班', 80, 80 )
insert into tb values('二班', 90, 80 )
insert into tb values('二班', 90, 60 )
insert into tb values('一班', 80, 90 )
go

select * from
(
select * from tb
union all
select 班级 + '小计' 班级, sum(语文) 语文, sum(数学) 数学 from tb group by 班级 + '小计'
union all
select '合计' 班级, sum(语文) 语文, sum(数学) 数学 from tb
) t
order by case 班级 when '合计' then 2 else 1 end , 班级

drop table tb
一品梅 2008-03-24
  • 打赏
  • 举报
回复
不需要,直接在数据库里就可以实现。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧