neuhawk

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

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

  1,继承DataGridView,添加表头信息类。
  2,添加CellPainting,代码如下:
  private void DataGridViewEx_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        
{
            
if (e.RowIndex == -1)
            
{
             
//   int w = dataGridView1.HorizontalScrollingOffset + dataGridView1.TopLeftHeaderCell.Size.Width + dataGridView1.Columns[0].Width + 10;


                Rectangle newRect 
= new Rectangle(e.CellBounds.X + 1,
               e.CellBounds.Y 
+ 1, e.CellBounds.Width - 4,
               e.CellBounds.Height 
- 4);

                
using (
                    Brush gridBrush 
= new SolidBrush(this.GridColor),
                    backColorBrush 
= new SolidBrush(e.CellStyle.BackColor))
                
{
                    
using (Pen gridLinePen = new Pen(gridBrush))
                    
{
                        
// Erase the cell.
                        e.Graphics.FillRectangle(backColorBrush, e.CellBounds);

                        
// Draw the grid lines (only the right and bottom lines;
                        
// DataGridView takes care of the others).
                        e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left,
                            e.CellBounds.Bottom 
- 1, e.CellBounds.Right - 1,
                            e.CellBounds.Bottom 
- 1);
                        
if (e.ColumnIndex > -1 && topRow!=null&&topRow.Cells[e.ColumnIndex].ColSpan>1)
                        
{
                            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right 
- 1,
                                e.CellBounds.Top 
+ e.ClipBounds.Height / 2, e.CellBounds.Right - 1,
                                e.CellBounds.Bottom);
                        }

                        
else
                        
{
                            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right 
- 1,
                                                          e.CellBounds.Top, e.CellBounds.Right 
- 1,
                                                          e.CellBounds.Bottom);
                        }


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

                        
int scale = e.CellBounds.Height/3;
                        
if (e.ColumnIndex > -1 && topRow.Cells[e.ColumnIndex].Text != null)
                        
{
                            scale
= e.CellBounds.Height / 2;
                            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom 
- e.CellBounds.Height / 2, e.CellBounds.Right, e.CellBounds.Bottom - e.CellBounds.Height / 2);
                        }

                        
// Draw the text content of the cell, ignoring alignment.

                      

                        
if (e.Value != null)
                        
{
                            e.Graphics.DrawString(e.Value.ToString(), e.CellStyle.Font,
                                Brushes.Crimson, e.CellBounds.X 
+ 2,
                                e.CellBounds.Y 
+ scale+ 2, StringFormat.GenericDefault);



                        }





                        
if (e.ColumnIndex > -1 &&  topRow.Cells[e.ColumnIndex].RelateIndex > -1 && topRow.Cells[e.ColumnIndex].Text!=null)
                    
                        
{
                            Rectangle recCell 
= new Rectangle(e.CellBounds.X - 1 - topRow.Cells[e.ColumnIndex].SpanRowWith,
           e.CellBounds.Y 
+ 1, topRow.Cells[e.ColumnIndex].SpanRowWith,
           e.CellBounds.Height 
/ 2);


                            StringFormat sf 
= new StringFormat();

                            sf.Alignment 
= StringAlignment.Center;


                            e.Graphics.DrawString(topRow.Cells[e.ColumnIndex].Text, e.CellStyle.Font, Brushes.Crimson, recCell, sf);

                        }

               
                        e.Handled 
= true;
                    }

                }

            }


        }

3,调用方法
  dataGridViewEx1.TopRow.Cells[2].Text = "入库";
            dataGridViewEx1.TopRow.Cells[
2].ColSpan = 2;


            dataGridViewEx1.TopRow.Cells[
4].Text = "出库";
            dataGridViewEx1.TopRow.Cells[
4].ColSpan = 2;
4,效果图


至于表尾合计,也做出了原型。二维表头+表尾合计,基本上满足需求了。
posted on 2006-09-28 18:06 neuhawk 阅读(4334) 评论(67)  编辑 收藏

Feedback

#1楼  2006-09-28 19:31 Dflying Chen      
cool!
  回复  引用  查看    

#2楼  2006-09-28 21:38 superstar      
很好,能否提供一个测试例子体验一下!
  回复  引用  查看    

#3楼 [楼主] 2006-09-28 22:41 neuhawk      
等国庆回来,完善一下先吧。
  回复  引用  查看    

#4楼  2006-09-29 01:03 antony.net      
学习!
  回复  引用  查看    

#5楼  2006-09-29 08:32 baicai      
期待完善后的示例...
  回复  引用  查看    

#6楼  2006-09-30 14:41 Reed [未注册用户]
试试sybase的datawindow.net control,很容易就实现这个了。
  回复  引用    

#7楼  2006-10-18 15:09 loran [未注册用户]
请问TopRow是变量还是DataGridView的方法?怎么用不起来呢?
  回复  引用    

#8楼  2006-11-01 09:44 appleseeker      
@loran
TopRows应该是自己封装类中的变量,是dataRow类型的吧
  回复  引用  查看    

#9楼  2006-11-12 18:17 音乐 [未注册用户]
有没有测试的例子,发布测试测试
  回复  引用    

#10楼  2006-11-12 18:19 音乐 [未注册用户]
做完给我一份,谢谢了
我的邮箱:jack_olcn@hotmail.com
  回复  引用    

#11楼 [楼主] 2006-11-17 10:18 neuhawk      
由于项目原因,现在忙工作流wf,winform得暂停一段时间.实在抱歉.
  回复  引用  查看    

#12楼  2006-11-17 15:12 xch [未注册用户]
能不能給我發二維表頭toprow的定義呀.謝謝!想看看...
EMail:x.c.h@163.com QQ:112891651
  回复  引用    

#13楼  2006-11-18 17:00 应旭彤 [未注册用户]
yidvjmye@163.com
  回复  引用    

#14楼  2006-11-30 16:38 wzp [未注册用户]
恳请楼主给一下topRow!!!
anwang163@163.com
  回复  引用    

楼主有例子能发一个吗?谢谢
Accelerator@126.com
最近被这个多表头搞得焦头烂额。
  回复  引用    

#16楼  2006-12-18 14:27 不再年少      
呵,能给我一份吗?学习中!
ztt.zhangyc@gmail.com
  回复  引用  查看    

搂主完成了吗?
目前我也正在学习如何用DataGridView实现多表头
能不能把你的Source也发给我一份呀
E-mail:zhouhongxian1020@163.com

谢谢
  回复  引用    

我也想学习一下,麻烦发一个嘛,谢谢!
lanin@126.com
  回复  引用    

#19楼  2007-02-01 11:26 wwf [未注册用户]
牛!
给一份代码学习一下吧!
wwf0718@gmail.com
  回复  引用    

#20楼  2007-02-05 10:35 秋叶 [未注册用户]
太差,我的做的你的要好用多了
  回复  引用    

#21楼  2007-02-05 16:59 风之子 [未注册用户]
to 秋叶:

你好,能给我发一份你的源码么?
henry621@gmail.com
  回复  引用    

#22楼  2007-02-08 09:50 秋叶 [未注册用户]
我qq:40267489

  回复  引用    

#23楼  2007-02-08 09:51 秋叶 [未注册用户]
代码现在属于公司的了,有保密协议的哦,不能随便发给你
  回复  引用    

#24楼  2007-02-08 10:01 秋叶 [未注册用户]
原理和楼主差不多,就是重画,但算法不一样
我的支持任意多行表头合并,任意多个列合并,边框与默认的比较兼容
应该做个属性TitleHeads
this.gridTest.TitleHeads = new string[] {
"Column1,Column1,Column1,Column1,Column2,Column2",
"Column1,Column1,Column3,Column4,Column5,Column5",
"Column1,Column2,Column3,Column4,Column7,Column8"};

默认先左右,后上下,自动识别合并
  回复  引用    

#25楼  2007-03-05 11:55 秋叶 [未注册用户]
http://www.cnblogs.com/xzcxlyh/archive/2007/03/05/664049.html
  回复  引用    

#26楼 [楼主] 2007-03-21 14:15 neuhawk      
要实现秋叶的功能,也不难的.
只不过我想保留datagridview column的header text,而且大部分是一个表头的,所以方案如此.
最近都忙windows workflow ,没有时间来做成商业的那样方便.
思路出来了,要实现也不是什么难事,这个东西是我刚学winform写的,:(
  回复  引用  查看    

#27楼  2007-04-03 11:15 cd [未注册用户]
topRow 是什么意思啊?
  回复  引用    

#28楼  2007-04-03 11:31 cd [未注册用户]
谁能发个代码我,谢谢!
chendong@19831118.com
  回复  引用    

#29楼  2007-04-03 11:43 叶子 [未注册用户]
谁能给我发一份你的源码么?
xiachenwan@yahoo.com.cn
  回复  引用    

#30楼  2007-04-08 19:05 soft_ware      
ljm80586@sina.com

谢谢
  回复  引用  查看    

#31楼  2007-04-09 17:16 wufeng [未注册用户]
topRow是哪里来的啊???
能给我发一份吗?
wufeng_aaa@126.com
  回复  引用    

#32楼  2007-04-13 16:33 li [未注册用户]
chun5357@163.com

谢谢
  回复  引用    

#33楼  2007-04-28 16:04 tgs [未注册用户]
能不能给我一份呀,topojuly@163.com,谢谢~
  回复  引用    

#34楼  2007-05-08 23:14 cai [未注册用户]
我也想要呀…谢谢!!
caijingy@163.com
  回复  引用    

#35楼  2007-05-10 16:03 whz [未注册用户]
能否给个demo?
wangh_z@126.com
  回复  引用    

#36楼  2007-05-16 08:25 xiwu2008 [未注册用户]
http://xiwu2008.blog.163.com/blog/
  回复  引用    

#37楼  2007-05-31 10:04 hw [未注册用户]
能给我一份吗?? 特别是那个TOPROW,,,下周就开始做项目了,还没有调查出来啊!!谢谢了
mirle159@yahoo.com.cn
  回复  引用    

请给份源码好吗
redsnow@126.com
非常感谢
  回复  引用    

#39楼  2007-07-01 12:03 hzf [未注册用户]
hthyhuang@163.com
谢谢!
  回复  引用    

#40楼  2007-07-16 21:29 唐德兵      
大哥,求你了,把你的这个完整的源代码给我发一个吧,我也在做仓库管理系统啊。我现在急要啊。大哥,求你了,给我发一个吧!
  回复  引用  查看    

#41楼  2007-07-22 14:18 sky [未注册用户]
能给个完整的源代码学学么?谢谢!
dengchao29@msn.com
  回复  引用    

#42楼  2007-08-05 21:06 朱晓哎 [未注册用户]
我也求大哥了,给一份完整的给我吧rain_day@126.com
  回复  引用    

#43楼  2007-08-05 21:41 朱晓哎 [未注册用户]
toprow死活找不到是什么东西,查过了htmltable上到是有colspan这东西,datagridview里就是找不到
  回复  引用    

#44楼  2007-08-20 18:35 *** [未注册用户]
把toprow的定义发表一下吧
  回复  引用    

#45楼  2007-08-21 11:19 feaphy [未注册用户]
发个demo给我吧,我的邮箱lhl86@sina.com,谢谢了
  回复  引用    

#46楼  2007-08-24 13:49 Vicky [未注册用户]
煩請Demo給我好嗎? 我的Mail Address 是vicky0223tw@hotmail.com
  回复  引用    

#47楼  2007-08-28 11:03 gzxujiang      
能给份TopRow的相关代码吗?谢谢
我的邮箱:myemail20002@163.com
  回复  引用  查看    

#48楼  2007-09-06 09:57 kkfvjmtd [未注册用户]
我也是急需呀,这两天被这东西搞的晕天黑地,我的邮箱是lvxufeng426@163.com,我也是要TopRow的相关代码,谢了先。
  回复  引用    

#49楼  2007-09-10 10:23 sonnydica [未注册用户]
能给份TopRow的相关代码吗?正愁这呢 谢谢!
jimmydica@163.com
  回复  引用    

#50楼  2007-09-14 10:23 zhaojun [未注册用户]
能发一份代码给我看看吗??
andyandzhaojun@163.com
谢谢先
  回复  引用    

#51楼  2007-09-18 11:19 tmamd [未注册用户]
能发一份代码交流一下啊,
xyj_88@126.com
谢谢!!!
  回复  引用    

#52楼  2007-09-27 15:44 aaaaaaaa [未注册用户]
aaa
  回复  引用    

#53楼  2007-09-27 15:49 ╃小〥斌╄      
用flexgrid 就很简单了 。 datagridview确实很多情况下满足不了需求 。 最近做的DEMO里还要求表侧3重 表头3重 还有父子表。 DataGridView 用起来确实头疼。
  回复  引用  查看    

#54楼  2007-10-09 13:39 Saiman [未注册用户]
最近做了一个支持父子表与多层的DataGridView控件...

发现这种二维列头是一个不错的功能与想法...

借鉴一下, 集成到我的控件库内...

继续加油吧...

(变通一下)其实还可以做成二维行头的...
  回复  引用    

#55楼  2007-10-17 21:53 yuyapeng [未注册用户]
能否给小弟发一份了,小菜鸟急用!
email:yuypapeng@gmail.com
先谢过大哥!
  回复  引用    

楼主的代码好象没有经过严格测试,在某些情况下表头字符显示不出来,或者显示一半.
  回复  引用    

#57楼  2007-11-14 10:48 三只熊      
能否给小妹发一份源码,谢谢!!!
lanxinmsn@msn.com
  回复  引用  查看    

#58楼  2007-11-23 16:47 王小妹 [未注册用户]
能否给小妹发一份源码?
ht1868@163.com
  回复  引用    

#59楼  2007-12-04 00:16 希萍 [未注册用户]
能否给小妹发一份源码,谢谢!!!
sunxp@mail.mas.ah163.net
  回复  引用    

#60楼  2007-12-15 17:36 lulu [未注册用户]
能不能给我也发一份,急需要.谢谢

lugaobiao@21cn.com
  回复  引用    

#61楼  2008-01-07 14:34 nikelee [未注册用户]
能不能给我也发一份,急需要.谢谢

jianqi_lee@sina.com
  回复  引用    

#62楼  2008-02-15 10:56 什么的外      
toprow什么意思呀
能不能说明一下呀?
  回复  引用  查看    

#63楼  2008-03-04 16:37 nikelee [未注册用户]
得瑟那
  回复  引用    

#64楼  2008-0