zoukankan      html  css  js  c++  java
  • winform让DataGridView显示行号

    在做一个东西中用到了DataGridView,并且要显示行号及其他操作(在后面的随笔中再添加吧,还没写好呢),所以,在网上搜索了相关资料,小结如下:

    方法一:

    我们可以在DataGridView的RowPostPaint事件中进行绘制。RowPostPaint事件,具体可以参照MSDN。

    下面是实现代码:

    1、
    private void Form1_Load(object sender, System.EventArgs e)
    
    {
    
        dataGridView1.Dock = DockStyle.Fill;
    
        dataGridView1.DataSource = System.Drawing.Imaging.ImageCodecInfo.GetImageDecoders();
    
    }
    
     
    
    private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
    
    {
    
          System.Drawing.Rectangle rectangle = new System.Drawing.Rectangle(e.RowBounds.Location.X,
    
            e.RowBounds.Location.Y,
    
            dataGridView1.RowHeadersWidth - 4,
    
            e.RowBounds.Height);
    
     
    
          TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(),
    
            dataGridView1.RowHeadersDefaultCellStyle.Font,
    
            rectangle,
    
            dataGridView1.RowHeadersDefaultCellStyle.ForeColor,
    
            TextFormatFlags.VerticalCenter | TextFormatFlags.Right);
    
    }
    View Code

      

    2、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位,如100、1000,在选中该行时,DataGridView的行指示符▶会把行号往右挤,导致现实不全,100的时候显示▶ 10;

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

    我试了一下好像可以,上面绘制行号的方法在大行号的情况下显示也会有问题。 

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

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

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

    代码如下: 

    RowsAdded & RowsRemoved 
    privatevoidDataGridView1_RowsAdded(objectsender, DataGridViewRowsAddedEventArgs e)
    {
            for(inti =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(inti =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();
            }
    }
    
    
    privatevoidDataGridView1_RowsRemoved(objectsender, DataGridViewRowsRemovedEventArgs e)
    {
            for(inti =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(inti =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();
            }
    }

    另外:经过搜索,下面几个博客中有DataGridView的详细介绍:

     Lullaby's Blog       : http://blog.csdn.net/fangxing80/article/details/1561011#A8

     个人开发历程知识库 : http://www.cnblogs.com/peterzb/archive/2009/05/29/1491891.html

    感谢以上两位作者的辛勤劳动!

  • 相关阅读:
    跃迁方法论 Continuous practice
    EPI online zoom session 面试算法基础知识直播分享
    台州 OJ 2648 小希的迷宫
    洛谷 P1074 靶形数独
    洛谷 P1433 DP 状态压缩
    台州 OJ FatMouse and Cheese 深搜 记忆化搜索
    台州 OJ 2676 Tree of Tree 树状 DP
    台州 OJ 2537 Charlie's Change 多重背包 二进制优化 路径记录
    台州 OJ 2378 Tug of War
    台州 OJ 2850 Key Task BFS
  • 原文地址:https://www.cnblogs.com/zjsjiangnan/p/3465342.html
Copyright © 2011-2022 走看看