datagridview中添加合计行(二)

http://blog.csdn.net/wudi626/article/details/2415592


合计时效果如下:

平均值时的效果:

文字显示时的效果:

因为一些原因源代码不能完全公布,所以这里只谈下实现思路:因为datagridview控件本身没有自动合计的功能,而在每次绑定时向网格底部插入一空行实现合计的办法既不方便又不灵活,而且不能达到时刻可以看到合计的效果,必须每次都手动拖动滚动条到底端来看,所以这种实现办法不够理想.就想了以下一种方法来实现.用一个PANEL和一个DAGRIDVIEW组成一个复合控件,在DATAGRIDVIEW的PAINT方法中,来手工绘制合计.绘制的时候有2个难点,一是合计的数字,一是分隔线.数字采用DATATABLE.COMPUTE()方法来得到,至于显示的位置就和绘制线条的位置归属于一个问题了.需要得到可见的第一列的HIDDEN的宽,然后从此列开始,累计每列的宽度和(第一可见列要用COLUMNWIDTH - HIDDEN),这样我们就可以比较方便的得到分隔线的位置与数字的位置了.因为时间问题,先谈到这里,如有需要进一步讨论,可以留言给我.

部分源代码:

 

         private  DataTable SourceDataTable; // GRID数据源
         private   bool  _IsShowFooter  =   true ; // GRID是否显示脚注
         private  Color _GridFooterBackColor  =  SystemColors.Info; // GRIDFOOTER背景色
         private  String _GridFooterHeader  =   " SUM " ;
        
private  TotalType _GridFooterTotalType;
        
private   string  _CustomerString;
        
private   bool  _IsShowSumHeader  =   true // 是否显示合计标题
         public   enum  TotalType
        
... {
            SUM 
= 0,//求和
            AVG = 1,//均值
            CUSTOMER//自定义字符串
        }

        
public  JCSGridControl()
        
... {
            InitializeComponent();

            
this.Grid.ScrollBars = ScrollBars.Both;
            
this.GridFooter.BackColor = this.Grid.BackgroundColor;

            
if (this._IsShowFooter)
            
...{
                GridFooter.Visible 
= true;
                
//this.Grid.Gridvscroollbar.BringToFront();
                this.GridFooter.Paint += new PaintEventHandler(GridFooter_Paint);
            }

            
else
            
...{
                GridFooter.Visible 
= false;
                
this.Grid.ScrollBars = ScrollBars.Vertical;
            }

            
this.Grid.Paint += new PaintEventHandler(Grid_Paint);
            
this.Grid.RowPostPaint += new DataGridViewRowPostPaintEventHandler(Grid_RowPostPaint);
        }


        
void  Grid_Paint( object  sender, PaintEventArgs e)
        
... {
            
if (!this.DesignMode)
                DrawSumColumnLine();
        }

        
// 绘制行号
         private   void  Grid_RowPostPaint( object  sender, DataGridViewRowPostPaintEventArgs e)
        
... {
            
if (!this.Grid.RowHeadersVisible) return;
            
if (this.Grid.RowHeadersWidth < 40return;
            
//定义一个矩形
            Rectangle rectangle = new Rectangle(e.RowBounds.Location.X, e.RowBounds.Location.Y,
                Grid.RowHeadersWidth 
- 1, e.RowBounds.Height);

            TextRenderer.DrawText(e.Graphics, (e.RowIndex 
+ 1).ToString(),
                Grid.RowHeadersDefaultCellStyle.Font,
                rectangle,
                Grid.RowHeadersDefaultCellStyle.ForeColor,
                TextFormatFlags.VerticalCenter 
| TextFormatFlags.Right);
        }

*调整导出及打印的格式与显示一致;合计,详细参见第10条修正功能,全部源码及示例。 * 文 件 名:DataGridViewEx.cs * 创 建 人:明振居士 * Email:nzj.163@163.com qq:342155124 * 创建时间:2010-06-01 * 最后修改时间:2012-1-19 增加第10条所示的功能;修改了列头超过26列的错误,导出excel为数组方式,速度更快,导出的单元格设置为文本格式。 * 标 题:用户自定义的DataGridView控件 * 功能描述:扩展DataGridView控件功能 * 扩展功能: * 1、搜索Search(); 有两个同明方法,参数不同 F3为快捷键继续向下搜索 * 2、用TreeView HeadSource 来设置复杂的标题样式,如果某个节点对应的显示列隐藏,请将该节点Tag设置为hide,隐藏列的排列位置与绑定数据元列位置对应,树叶节点的顺序需要与结果集的列顺序一致 * 3、通过反射导出Excel,无需引用com组件,方法ExportExcel() ,不受列数的限制,表头同样可以导出,AutoFit属性设置导出excel后是否自动调整单元格宽度 * 导出内容支持自定义的:Title List Header List Footer,支持在设计时值的设定,窗口关闭时Excel资源自动彻底释放 * 4、可以自己任意设定那些列显示及不显示,通过调用方法SetColumnVisible()实现。 * 5、设置列标题SetHeader(),设置列永远可见AlwaysShowCols(),设置列暂时不可见HideCols() * 注意,当使用了TreeView作为复杂Header时,不要使用本方法,Header显示的内容根据treeview内容而显示 * 6、列宽度及顺序的保存SaveGridView(),加载LoadGridView() * 7、支持所见即所得的打印功能,举例如下 * private void button5_Click(object sender, EventArgs e) { DGVPrinter printer = new DGVPrinter(); printer.PrintPreviewDataGridView(DataGridViewEx1); } * 8、自定义合并与列,合并用 MergeRowColumn 属性,列合并用MergeColumnNames属性,都可以定义多个列 * 9、标号的设置 bool ShowRowNumber; * 10、增加最后一的汇总,支持列的聚合函数,参见http://msdn.microsoft.com/zh-cn/library/system.data.datacolumn.[removed]v=VS.100).aspx * 假设对id列显示“合计”字符,avgPrice进平均值,total列显示合计,则对ComputeColumns增加三内容:id,合计:;avgPrice,Avg(avgPrice);total,Sum(total) * 如果需要对值进格式控制,请实现beforeShow事件 * 增加了导出和打印对应的支持,所见即所得的对齐方应用于式导出及打印。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值