zoukankan      html  css  js  c++  java
  • C# DataGridView显示行号的三种方法

    C# DataGridView显示行号的三种方法

     分类:

    方法一:

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

    [csharp] view plain copy
     
    1. private void dgGrid_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)  
    2. {  
    3.     var grid = sender as DataGridView;  
    4.     var rowIdx = (e.RowIndex + 1).ToString();  
    5.   
    6.     var centerFormat = new StringFormat()   
    7.     {   
    8.         // right alignment might actually make more sense for numbers  
    9.         Alignment = StringAlignment.Center,   
    10.         LineAlignment = StringAlignment.Center  
    11.     };  
    12.   
    13.     var headerBounds = new Rectangle(e.RowBounds.Left, e.RowBounds.Top, grid.RowHeadersWidth, e.RowBounds.Height);  
    14.     e.Graphics.DrawString(rowIdx, this.Font, SystemBrushes.ControlText, headerBounds, centerFormat);  
    15. }  


     

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

    方法二:

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

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

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

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

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

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

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

    代码如下:

    [csharp] view plain copy
     
    1. private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)  
    2.        {  
    3.   
    4.            for (int i = 0; i < e.RowCount; i++)  
    5.            {  
    6.                dataGridView1.Rows[e.RowIndex + i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;  
    7.                dataGridView1.Rows[e.RowIndex + i].HeaderCell.Value = (e.RowIndex + i + 1).ToString();  
    8.            }  
    9.   
    10.            for (int i = e.RowIndex + e.RowCount; i < this.dataGridView1.Rows.Count; i++)  
    11.            {  
    12.                dataGridView1.Rows[i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;  
    13.                dataGridView1.Rows[i].HeaderCell.Value = (i + 1).ToString();  
    14.            }  
    15.        }  
     
    [csharp] view plain copy
     
    1. private void dataGridView1_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)  
    2.         {  
    3.             for (int i = 0; i < e.RowCount; i++)  
    4.             {  
    5.                 dataGridView1.Rows[e.RowIndex + i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;  
    6.                 dataGridView1.Rows[e.RowIndex + i].HeaderCell.Value = (e.RowIndex + i + 1).ToString();  
    7.             }  
    8.   
    9.             for (int i = e.RowIndex + e.RowCount; i < this.dataGridView1.Rows.Count; i++)  
    10.             {  
    11.                 dataGridView1.Rows[i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;  
    12.                 dataGridView1.Rows[i].HeaderCell.Value = (i + 1).ToString();  
    13.             }  
    14.         }  

    方法三:
    对于ReadOnly的Display,有更为简便的方法
    [csharp] view plain copy
     
    1. private void dataGridView1_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)  
    2.        {  
    3.            e.Row.HeaderCell.Value = string.Format("{0}", e.Row.Index + 1);  
    4.        }     
  • 相关阅读:
    hdu 1823 Luck and Love 二维线段树
    UVA 12299 RMQ with Shifts 线段树
    HDU 4578 Transformation 线段树
    FZU 2105 Digits Count 线段树
    UVA 1513 Movie collection 树状数组
    UVA 1292 Strategic game 树形DP
    【ACM】hdu_zs2_1003_Problem C_201308031012
    qsort快速排序
    【ACM】nyoj_7_街区最短路径问题_201308051737
    【ACM】nyoj_540_奇怪的排序_201308050951
  • 原文地址:https://www.cnblogs.com/zouhao/p/7245121.html
Copyright © 2011-2022 走看看