打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
DataGridView添加行号
userphoto

2010.11.17

关注

自己在做WINFORM小玩意的时候需要在datagridview上显示行号,上网搜索一下,找到如下代码,不错,先记录下来了。
    在RowPostPaint事件中画出来

C#代码
  1. // 绘制行号   
  2. private void gvdata_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)   
  3. {   
  4.     try  
  5.     {   
  6.   
  7.         Rectangle rectangle = new Rectangle(e.RowBounds.Location.X,   
  8.   
  9.             Convert.ToInt32(e.RowBounds.Location.Y + (e.RowBounds.Height - gvdata.RowHeadersDefaultCellStyle.Font.Size) / 2),   
  10.   
  11.             gvdata.RowHeadersWidth - 4, e.RowBounds.Height);   
  12.   
  13.         TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(),   
  14.   
  15.             gvdata.RowHeadersDefaultCellStyle.Font, rectangle, gvdata.RowHeadersDefaultCellStyle.ForeColor,   
  16.   
  17.             TextFormatFlags.Right);   
  18.   
  19.   
  20.   
  21.     }   
  22.   
  23.     catch (Exception ex)   
  24.     {   
  25.   
  26.         Console.Write("dgv1_RowPostPaint:" + ex.Message);   
  27.   
  28.     }   
  29. }  

效果如图:
 
 /*
              #region dataGridView    //显示行号
              private void dataGridView_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
              {
                  Rectangle rectangle = new Rectangle(e.RowBounds.Location.X,
                  e.RowBounds.Location.Y,
                  dataGridView.RowHeadersWidth - 8,
                  e.RowBounds.Height);
           
                  TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(),
                      dataGridView.RowHeadersDefaultCellStyle.Font,
                      rectangle,
                      dataGridView.RowHeadersDefaultCellStyle.ForeColor,
                      TextFormatFlags.VerticalCenter | TextFormatFlags.Right);
            
              }
              #endregion  
 
                private void dataGridView_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)   
                {          
                    try          
                    {                //添加行号       
                SolidBrush v_SolidBrush = new SolidBrush(dataGridView.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, "操作失败");
                   }  
                }
         */

人云亦云,我为DataGridView控件显示行号正名

  前些天在写个小程序,用到DataGridView,想给它动态的显示行号。不是很费劲GOOGLE了一下,这GOOGLE不要紧,发现了不少问题。以下基本上都是GOOGLE搜索出来的网上的一些解决方法,千篇一律都是这样的:

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

 

只要用过这段代码的人就应该发现这段代码是运行出错的。原因就出在RowsRemoved事件里,会抛出一个Index outof range的异常。然而就是这么一段有错的代码,几乎充斥着整个互联网,千篇一律的COPY,没有一个人纠正。

先说下这段代码出错的原因吧:

在RowsRemoved事件里,最开始生成DataGridView的数据的时候,也是会触发这个事件的。这个时候DataGridView控件的Rows.Count就是0。那下面这行代码就有问题了:

this.dgvKBRollUp.Rows[e.RowIndex + i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;            

e.RowIndex + i,这里对应的是Rows[0],但是Rows.Count还是0啊,Rows[0]是不存在的。要存在Rows[0]起码DataGridView控件要有一行才行。为了避免这个错误,小小的修改代码就行了:

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

只要加上一个对Rows.Count的判断就可以避免这个错误。希望网上的一些COPY的朋友也要注意了,以后COPY过来的时候,自己还是要动手验证一下。将一个错误的信息胡乱的传播是对一些新手以及自己都不怎么好的。

最后附上微软MSDN里面关于e.RowIndex和e.RowCount的一段代码:

System.Text.StringBuilder messageBoxCS = new System.Text.StringBuilder();            messageBoxCS.AppendFormat("{0} = {1}", "RowIndex", e.RowIndex);            messageBoxCS.AppendLine();            messageBoxCS.AppendFormat("{0} = {1}", "RowCount", e.RowCount);            messageBoxCS.AppendLine();            MessageBox.Show(messageBoxCS.ToString(), "RowsRemoved Event");            

通过这段代码你可以很轻松地跟踪事件参数里的e.RowIndex和e.RowCount的值。当然你可以DEBUG,一样的。我就是DEBUG的?O(∩_∩)O~

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C# DataGridView显示行号的三种方法
DataGridView的虚模式填充
Windows Forms DataGridView 中合并单元格(转)
DataGridView 实现拖拽替换数据
C#实例:datagridview单元格合并
VA11.2 DataGridView隐藏行、列
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服