显示DataGrid序号的一个适用的方法

  我在网上查了好几个例子,如果数据量小的话没有问题,一旦数据量大,显示特别慢,还有个缺点就是拖动行高时行号不随行高的变化而变动,出现是几个序号在一个单元格中显示。我自己对他们的算法进行总结,写出一个效果比较不错的带序号的 DataGrid 。原理:只显示表格中显示行的序号,并且拖动行,行号一起移动。
override   protected   void  OnPaint(PaintEventArgs e)

{

base .OnPaint(e);

    
try

    {

        
if ( this .DataSource != null )

        {           

        
int  yDelta; 

        System.Drawing .Rectangle cell
= this .GetCellBounds( 0 , 0 );

        
int  y = cell.Top  + 2 ;

        e.Graphics.DrawString(
" 编号 " this .Font,  new  SolidBrush(Color.Black),  8 , y - 18 );  //

        
if ( this .VisibleRowCount  > 0 ) // 只在有记录集时在表格中显示序号

        {                   

            CurrencyManager cm;

            cm 
=  (CurrencyManager)  this .BindingContext[ this .DataSource,  this .DataMember]; 

            
if (cm.Count  > 0 )

            {                       

                
int  nRow =- 1 ;

                y
= 41 ;            // 为第一行默认高度

                
while (nRow < 0 )

                {

nRow
= this .HitTest ( 8 ,y).Row ;

                    y
++ ;

                }

                
int  nCount = 0 ;

                
while (y < this .Height  &&  nCount < this .VisibleRowCount )

                {

                    
string  text  =   string .Format( " {0} " , nRow + nCount + 1 ); 

                    e.Graphics.DrawString(text, 
this .Font,  new  SolidBrush(Color.Black),  10 , y); 

                    yDelta 
=   this .GetCellBounds( nRow + nCount, 0 ).Height  +   1 ; // ****表示一行高度的参数

                    y 
+=  yDelta; 

// 如果下面有子行显示序号的区分显示   

                    
if ( this .IsExpanded (nRow + nCount) &&  nRow + nCount + 1 < cm.Count )                                 {

                        y
+= this .GetCellBounds (nRow + nCount + 1 , 0 ).Height  + 3 ;

                    }

                    nCount
++ ;       

                }

}

        }

        }

    }

    
catch

    {}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值