问题是这样的,我需要在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);
            }
        }
    }

解决方案 »

  1.   

    给你个例子:
    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
      

  2.   

    给你几个链接,可以参考一下:
    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 
      

  3.   

    不是这样的,我需要在用户在Grid里输入数据的时候就开始运算(Sum,Avg,Max,Min一类的统计信息),如果是在数据库里的运算我也不用去重载DataGridView了,不过谢谢你的SQL也是一种思路,只是不适合我的需求。
      

  4.   

    若单纯是继承DataGridView实现底部合计行.
    可以通过重写OnPaint事件,在DataGridview底部手动绘制一行.这种方法除了拖动滚动条时有一点点闪之外,还是比较好的.若要做得比较完美,可考虑做成组合控件,在DataGridView下面增加另外的控件来显示统计信息,如另一个不带标题的DataGridView,Panel等.后一种方式比较可行!
      

  5.   

    to ydsunny
    我是在OnPaint Event里绘制合计行,可是当记录数过多出现滚动条的时候就会出现合计行出现不全的问题了。
    至于你说的第二种办法,我过去在Delphi里用过类似的,要同步绘制的东西太多,我觉得这种办法更适合做较fix的报表。
    回到我提出的问题,我只是希望当GridView访问DataGridViewRowCollection的GetRowCount方法时返回我要加入绘制的行数,可当我重写了DataGridViewRowCollection的public int new GetRowCount(DataGridViewElementStates filter),这个方法不会被DataGridView调用,是不是我的写法那里有问题?我对C#不是很熟,请大家帮忙呀。
      

  6.   

    你先计算出合计行的位置,然后在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));.....