Datagridview 实现二维表头

原文地址为: Datagridview 实现二维表头

      最近把我们的b/s系统,增加智能客户端的功能。确实智能客户端是非常好用的东西。可惜winform的控件功能不怎么强大,相比vb差很多啊。比如 DataGridView不支持二维表头,不支持表尾合计,相比之下 web的好办多了(还是喜欢Web的排版、导航,但喜欢Win的操作性,希望WPF早日流行)。

       但是 MIS系统没有二维表头确实是客户不能接受的,尝试了com控件flexgrid或者开源的SourceGrid3,但都不怎么好用,于是想改造一下DataGridView。我的做法是在CellPainting做手脚。花了一天时间尝试,只是做出原型,还没有完善,希望有需要的朋友少走弯路。

  1,继承DataGridView,添加表头信息类。
  2,添加CellPainting,代码如下:
731655954c7be9d8835ece551b5385f8.jpe    private   void  DataGridViewEx_CellPainting( object  sender, DataGridViewCellPaintingEventArgs e)
24a924a57ba6b3f2b51fc9edb7ea4186.jpe9310e85a14af99de4811ff4c77f1f911.jpe        
222530190136c9c4cfd237cc0d5cff99.jpe {
1408c5260b2f05e450dee929db9be5f7.jpe            
if (e.RowIndex == -1)
715f2d05503b99d41f3b6ba2cdccc84d.jpee083dfde5a91f50979fe8979b4012b9d.jpe            
222530190136c9c4cfd237cc0d5cff99.jpe{
1408c5260b2f05e450dee929db9be5f7.jpe             
//   int w = dataGridView1.HorizontalScrollingOffset + dataGridView1.TopLeftHeaderCell.Size.Width + dataGridView1.Columns[0].Width + 10;
1408c5260b2f05e450dee929db9be5f7.jpe

1408c5260b2f05e450dee929db9be5f7.jpe
1408c5260b2f05e450dee929db9be5f7.jpe                Rectangle newRect 
= new Rectangle(e.CellBounds.X + 1,
1408c5260b2f05e450dee929db9be5f7.jpe               e.CellBounds.Y 
+ 1, e.CellBounds.Width - 4,
1408c5260b2f05e450dee929db9be5f7.jpe               e.CellBounds.Height 
- 4);
1408c5260b2f05e450dee929db9be5f7.jpe
1408c5260b2f05e450dee929db9be5f7.jpe                
using (
1408c5260b2f05e450dee929db9be5f7.jpe                    Brush gridBrush 
= new SolidBrush(this.GridColor),
1408c5260b2f05e450dee929db9be5f7.jpe                    backColorBrush 
= new SolidBrush(e.CellStyle.BackColor))
715f2d05503b99d41f3b6ba2cdccc84d.jpee083dfde5a91f50979fe8979b4012b9d.jpe                
222530190136c9c4cfd237cc0d5cff99.jpe{
1408c5260b2f05e450dee929db9be5f7.jpe                    
using (Pen gridLinePen = new Pen(gridBrush))
715f2d05503b99d41f3b6ba2cdccc84d.jpee083dfde5a91f50979fe8979b4012b9d.jpe                    
222530190136c9c4cfd237cc0d5cff99.jpe{
1408c5260b2f05e450dee929db9be5f7.jpe                        
// Erase the cell.
1408c5260b2f05e450dee929db9be5f7.jpe
                        e.Graphics.FillRectangle(backColorBrush, e.CellBounds);
1408c5260b2f05e450dee929db9be5f7.jpe
1408c5260b2f05e450dee929db9be5f7.jpe                        
// Draw the grid lines (only the right and bottom lines;
1408c5260b2f05e450dee929db9be5f7.jpe                        
// DataGridView takes care of the others).
1408c5260b2f05e450dee929db9be5f7.jpe
                        e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left,
1408c5260b2f05e450dee929db9be5f7.jpe                            e.CellBounds.Bottom 
- 1, e.CellBounds.Right - 1,
1408c5260b2f05e450dee929db9be5f7.jpe                            e.CellBounds.Bottom 
- 1);
1408c5260b2f05e450dee929db9be5f7.jpe                        
if (e.ColumnIndex > -1 && topRow!=null&&topRow.Cells[e.ColumnIndex].ColSpan>1)
715f2d05503b99d41f3b6ba2cdccc84d.jpee083dfde5a91f50979fe8979b4012b9d.jpe                        
222530190136c9c4cfd237cc0d5cff99.jpe{
1408c5260b2f05e450dee929db9be5f7.jpe                            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right 
- 1,
1408c5260b2f05e450dee929db9be5f7.jpe                                e.CellBounds.Top 
+ e.ClipBounds.Height / 2, e.CellBounds.Right - 1,
1408c5260b2f05e450dee929db9be5f7.jpe                                e.CellBounds.Bottom);
5bcb1807ee3e00d2b3c225f0b3f5c751.jpe                        }

1408c5260b2f05e450dee929db9be5f7.jpe                        
else
715f2d05503b99d41f3b6ba2cdccc84d.jpee083dfde5a91f50979fe8979b4012b9d.jpe                        
222530190136c9c4cfd237cc0d5cff99.jpe{
1408c5260b2f05e450dee929db9be5f7.jpe                            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right 
- 1,
1408c5260b2f05e450dee929db9be5f7.jpe                                                          e.CellBounds.Top, e.CellBounds.Right 
- 1,
1408c5260b2f05e450dee929db9be5f7.jpe                                                          e.CellBounds.Bottom);
5bcb1807ee3e00d2b3c225f0b3f5c751.jpe                        }

1408c5260b2f05e450dee929db9be5f7.jpe
1408c5260b2f05e450dee929db9be5f7.jpe                        
// Draw the inset highlight box.
1408c5260b2f05e450dee929db9be5f7.jpe                        
//   e.Graphics.DrawRectangle(Pens.Blue, newRect);
1408c5260b2f05e450dee929db9be5f7.jpe

1408c5260b2f05e450dee929db9be5f7.jpe                        
int scale = e.CellBounds.Height/3;
1408c5260b2f05e450dee929db9be5f7.jpe                        
if (e.ColumnIndex > -1 && topRow.Cells[e.ColumnIndex].Text != null)
715f2d05503b99d41f3b6ba2cdccc84d.jpee083dfde5a91f50979fe8979b4012b9d.jpe                        
222530190136c9c4cfd237cc0d5cff99.jpe{
1408c5260b2f05e450dee929db9be5f7.jpe                            scale
= e.CellBounds.Height / 2;
1408c5260b2f05e450dee929db9be5f7.jpe                            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom 
- e.CellBounds.Height / 2, e.CellBounds.Right, e.CellBounds.Bottom - e.CellBounds.Height / 2);
5bcb1807ee3e00d2b3c225f0b3f5c751.jpe                        }

1408c5260b2f05e450dee929db9be5f7.jpe                        
// Draw the text content of the cell, ignoring alignment.
1408c5260b2f05e450dee929db9be5f7.jpe

1408c5260b2f05e450dee929db9be5f7.jpe                      
1408c5260b2f05e450dee929db9be5f7.jpe
1408c5260b2f05e450dee929db9be5f7.jpe                        
if (e.Value != null)
715f2d05503b99d41f3b6ba2cdccc84d.jpee083dfde5a91f50979fe8979b4012b9d.jpe                        
222530190136c9c4cfd237cc0d5cff99.jpe{
1408c5260b2f05e450dee929db9be5f7.jpe                            e.Graphics.DrawString(e.Value.ToString(), e.CellStyle.Font,
1408c5260b2f05e450dee929db9be5f7.jpe                                Brushes.Crimson, e.CellBounds.X 
+ 2,
1408c5260b2f05e450dee929db9be5f7.jpe                                e.CellBounds.Y 
+ scale+ 2, StringFormat.GenericDefault);
1408c5260b2f05e450dee929db9be5f7.jpe
1408c5260b2f05e450dee929db9be5f7.jpe
1408c5260b2f05e450dee929db9be5f7.jpe
5bcb1807ee3e00d2b3c225f0b3f5c751.jpe                        }

1408c5260b2f05e450dee929db9be5f7.jpe
1408c5260b2f05e450dee929db9be5f7.jpe
1408c5260b2f05e450dee929db9be5f7.jpe
1408c5260b2f05e450dee929db9be5f7.jpe
1408c5260b2f05e450dee929db9be5f7.jpe                        
if (e.ColumnIndex > -1 &&  topRow.Cells[e.ColumnIndex].RelateIndex > -1 && topRow.Cells[e.ColumnIndex].Text!=null)
1408c5260b2f05e450dee929db9be5f7.jpe                    
715f2d05503b99d41f3b6ba2cdccc84d.jpee083dfde5a91f50979fe8979b4012b9d.jpe                        
222530190136c9c4cfd237cc0d5cff99.jpe{
1408c5260b2f05e450dee929db9be5f7.jpe                            Rectangle recCell 
= new Rectangle(e.CellBounds.X - 1 - topRow.Cells[e.ColumnIndex].SpanRowWith,
1408c5260b2f05e450dee929db9be5f7.jpe           e.CellBounds.Y 
+ 1, topRow.Cells[e.ColumnIndex].SpanRowWith,
1408c5260b2f05e450dee929db9be5f7.jpe           e.CellBounds.Height 
/ 2);
1408c5260b2f05e450dee929db9be5f7.jpe
1408c5260b2f05e450dee929db9be5f7.jpe
1408c5260b2f05e450dee929db9be5f7.jpe                            StringFormat sf 
= new StringFormat();
1408c5260b2f05e450dee929db9be5f7.jpe
1408c5260b2f05e450dee929db9be5f7.jpe                            sf.Alignment 
= StringAlignment.Center;
1408c5260b2f05e450dee929db9be5f7.jpe
1408c5260b2f05e450dee929db9be5f7.jpe
1408c5260b2f05e450dee929db9be5f7.jpe                            e.Graphics.DrawString(topRow.Cells[e.ColumnIndex].Text, e.CellStyle.Font, Brushes.Crimson, recCell, sf);
1408c5260b2f05e450dee929db9be5f7.jpe
5bcb1807ee3e00d2b3c225f0b3f5c751.jpe                        }

1408c5260b2f05e450dee929db9be5f7.jpe               
1408c5260b2f05e450dee929db9be5f7.jpe                        e.Handled 
= true;
5bcb1807ee3e00d2b3c225f0b3f5c751.jpe                    }

5bcb1807ee3e00d2b3c225f0b3f5c751.jpe                }

5bcb1807ee3e00d2b3c225f0b3f5c751.jpe            }

1408c5260b2f05e450dee929db9be5f7.jpe
f466905a3bcb5dcef110eab799825254.jpe        }

3,调用方法
731655954c7be9d8835ece551b5385f8.jpe   dataGridViewEx1.TopRow.Cells[ 2 ].Text  =   " 入库 " ;
731655954c7be9d8835ece551b5385f8.jpe            dataGridViewEx1.TopRow.Cells[
2 ].ColSpan  =   2 ;
731655954c7be9d8835ece551b5385f8.jpe
731655954c7be9d8835ece551b5385f8.jpe
731655954c7be9d8835ece551b5385f8.jpe            dataGridViewEx1.TopRow.Cells[
4 ].Text  =   " 出库 " ;
731655954c7be9d8835ece551b5385f8.jpe            dataGridViewEx1.TopRow.Cells[
4 ].ColSpan  =   2 ;
4,效果图
26fca847a14669c05bb3d0b7ea664645.jpe

至于表尾合计,也做出了原型。二维表头+表尾合计,基本上满足需求了。

转载请注明本文地址: Datagridview 实现二维表头
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值