问题是这样的,我需要在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);
}
}
}
请问是不是我的办法不对?或者有更好的方法?
部分代码,如下:
// 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);
}
}
}
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 )
goselect * 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
csdn参考:
http://topic.csdn.net/u/20080305/14/4beda9e4-5bae-4184-a055-4de0f2605bfd.htmlgroup by ...with rollup
参考:http://dev.mysql.com/doc/refman/5.0/en/group-by-modifiers.html
http://aspnet.4guysfromrolla.com/articles/073003-1.aspx
可以通过重写OnPaint事件,在DataGridview底部手动绘制一行.这种方法除了拖动滚动条时有一点点闪之外,还是比较好的.若要做得比较完美,可考虑做成组合控件,在DataGridView下面增加另外的控件来显示统计信息,如另一个不带标题的DataGridView,Panel等.后一种方式比较可行!
我是在OnPaint Event里绘制合计行,可是当记录数过多出现滚动条的时候就会出现合计行出现不全的问题了。
至于你说的第二种办法,我过去在Delphi里用过类似的,要同步绘制的东西太多,我觉得这种办法更适合做较fix的报表。
回到我提出的问题,我只是希望当GridView访问DataGridViewRowCollection的GetRowCount方法时返回我要加入绘制的行数,可当我重写了DataGridViewRowCollection的public int new GetRowCount(DataGridViewElementStates filter),这个方法不会被DataGridView调用,是不是我的写法那里有问题?我对C#不是很熟,请大家帮忙呀。
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));.....