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

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

  • 相关阅读:
    jQuery火箭图标返回顶部代码
    类库引用EF
    Html.DropDownList
    MVC validation
    MVC @functions
    MVC 扩展方法特点
    Class 实现IDisposing方法
    MVC两个必懂核心
    Asp.net 服务器Application,Session,Cookie,ViewState和Cache区别
    sqlserver log
  • 原文地址:https://www.cnblogs.com/zjsjiangnan/p/3465342.html
Copyright © 2011-2022 走看看