C# 数组下标的问题

http://www.cnblogs.com/neuhawk/archive/2006/09/28/517507.html

      最近把我们的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,效果图


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值