DataGridView显示行号的几种方法

【转载地址】http://www.cnblogs.com/BlackBat/archive/2010/02/04/1663445.html

方法一:

网上最常见的做法是用DataGridViewRowPostPaint事件在RowHeaderCell中绘制行号:

ContractedBlock.gif ExpandedBlockStart.gif RowPostPaint
 
   
        private   void  dataGridView1_RowPostPaint( object  sender, DataGridViewRowPostPaintEventArgs e)
        {
            
try
            {
                
// 添加行号 
                SolidBrush v_SolidBrush  =   new  SolidBrush(dataGridView1.RowHeadersDefaultCellStyle.ForeColor);
                
int  v_LineNo  =   0 ;
                v_LineNo 
=  e.RowIndex  +   1 ;

                
string  v_Line  =  v_LineNo.ToString();

                e.Graphics.DrawString(v_Line, e.InheritedRowStyle.Font, v_SolidBrush, e.RowBounds.Location.X 
+   15 , e.RowBounds.Location.Y  +   5 );

            }
            
catch  (Exception ex)
            {
                MessageBox.Show(
" 添加行号时发生错误,错误信息: "   +  ex.Message,  " 操作失败 " );
            }
        }

 

但是这种方法在大数据量的时候性能比较差,每次滚动数据都会触发RowPostPaint事件。

 

 

方法二:

我的做法是给每行的HeaderCell赋值。

在网上发现有人提到这种做法,但是因为最后的显示问题而选择了上面的方法。具体问题就是,在行号超过2位,如1001000,在选中该行时,DataGridView的行指示符会把行号往右挤,导致现实不全,100的时候显示 10

其实还是RowsHeaderWidth的大小有问题,将该列的宽度放大,行号显示的也没问题!

不知道他们有没有试过,上面绘制行号的方法在大行号的情况下显示也会有问题。

 

既然知道问题所在就要找到相应的解决方法。

具体做法是将DataGridViewRowsHeaderWidthSizeMode属性 设置为AutoSizeToAllHeaders或者AutoSizeToDisplayedHeaders,这样自动设置宽度就不会出现行指示符挤压行号的情况了。

 

对于每次DataGridView的行变化,我们都去更新行号,用RowsAdded和RowsRemoved事件。

代码如下:

ContractedBlock.gif ExpandedBlockStart.gif RowsAdded & RowsRemoved
 
   
private void DataGridView1_RowsAdded( object sender, DataGridViewRowsAddedEventArgs e)
{
for ( int i = 0 ; i < e.RowCount; i ++ )
{
this .DataGridView1.Rows[e.RowIndex + i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;
this .DataGridView1.Rows[e.RowIndex + i].HeaderCell.Value = (e.RowIndex + i + 1 ).ToString();
}
for ( int i = e.RowIndex + e.RowCount; i < this .DataGridView1.Rows.Count; i ++ )
{
this .DataGridView1.Rows[i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;
this .DataGridView1.Rows[i].HeaderCell.Value = (i + 1 ).ToString();
}
}


private void DataGridView1_RowsRemoved( object sender, DataGridViewRowsRemovedEventArgs e)
{
for ( int i = 0 ; i < e.RowCount; i ++ )
{
this .DataGridView1.Rows[e.RowIndex + i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;
this .DataGridView1.Rows[e.RowIndex + i].HeaderCell.Value = (e.RowIndex + i + 1 ).ToString();
}
for ( int i = e.RowIndex + e.RowCount; i < this .DataGridView1.Rows.Count; i ++ )
{
this .DataGridView1.Rows[i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;
this .DataGridView1.Rows[i].HeaderCell.Value = (i + 1 ).ToString();
}
}

转载于:https://www.cnblogs.com/sea_peak/archive/2011/03/31/2001174.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值