zoukankan      html  css  js  c++  java
  • 【转】DataGridView显示行号

     ref:http://blog.csdn.net/xieyufei/article/details/9769631

    方法一:

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

     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事件。

    代码如下:

    private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)  
           {  
               for (int i = 0; i < e.RowCount; i++)  
               {  
                   dataGridView1.Rows[e.RowIndex + i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;  
                   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++)  
               {  
                   dataGridView1.Rows[i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;  
                   dataGridView1.Rows[i].HeaderCell.Value = (i + 1).ToString();  
               }  
           } 
    
    private void dataGridView1_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)  
            {  
                for (int i = 0; i < e.RowCount; i++)  
                {  
                    dataGridView1.Rows[e.RowIndex + i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;  
                    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++)  
                {  
                    dataGridView1.Rows[i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;  
                    dataGridView1.Rows[i].HeaderCell.Value = (i + 1).ToString();  
                }  
            }   
    方法三:
    对于ReadOnly的Display,有更为简便的方法
    private void dataGridView1_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)  
           {  
               e.Row.HeaderCell.Value = string.Format("{0}", e.Row.Index + 1);  
           }
  • 相关阅读:
    发现个atan2的正确使用方式
    Forward+ Shading架构
    fatal: unable to connect to gitee.com: gitee.com[0: 180.97.125.228]: errno=Unknown error 解决方案
    HDFS HA(高可用性)集群规划
    如何使用RTP引擎对语音编码进行转码
    关于 Angular 应用 tsconfig.json 中的 target 属性
    浅谈 Orbeon form builder 的权限控制
    关于 Angular 应用 tsconfig.json 中的 lib 属性
    orbeon form 通过 url 的方式同第三方应用集成的开发明细
    orbeon form 的配置介绍
  • 原文地址:https://www.cnblogs.com/leenice/p/5159301.html
Copyright © 2011-2022 走看看