DataGridView显示行号的几种方法来自http://www.soaspx.com/dotnet/csharp/csharp_20100204_2740.html

方法一:

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

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

代码如下:

private void DataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {
            for (int i = 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 (int i = 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();
            }
        }

private void DataGridView1_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
        {
            for (int i = 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 (int i = 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();
            }
        }

时间: 2024-10-09 19:36:30

DataGridView显示行号的几种方法来自http://www.soaspx.com/dotnet/csharp/csharp_20100204_2740.html的相关文章

显示行号的6种方法、chkconfig、tar、awk、cut过滤字符串、ps配合wc查看过滤进程

Day10 Georgekai-习惯:操作前备份,操作后检查 第1章 第二波剩余命令:显示行号的6种方法.chkconfig.tar.awk.cut过滤字符串.ps配合wc查看过滤进程 1.1 打印配置文件nginx.conf内容的行号及内容,该如何做? 1.1.1 花括号的作用 {} 注:生成序列,连续输入显示到屏幕,包括数字和字母 例1:[[email protected] ~]$ echo {1..10} 1 2 3 4 5 6 7 8 9 10 例二:[[email protected]

让DataGridView显示行号

http://www.cnblogs.com/JuneZhang/archive/2011/11/21/2257630.html 为了表示行号,我们可以在DataGridView的RowPostPaint事件中进行绘制.RowPostPaint事件,具体可以参照MSDN. 下面是实现代码: private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) { System.Dra

Winform中的DatagridView显示行号

1.设置 RowPostPaint 为true 2.启用RowPostPaint事件 /// <summary> /// DataGridView显示行号 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void dataGridWebConfigView_RowPostP

linux查看文件行号的七种方法

文件内容如下,要求显示文件内容对应的行号 [[email protected] ~ 13:01:16]# cat 123.txt  name:i am gaoyang birthday:19961025 what the fuck!!!! 1.cat -n 123.txt [[email protected] ~ 13:54:38]# cat -n 123.txt       1 name:i am gaoyang      2      3 birthday:19961025      4  

DataGridView显示行号

Private Sub DataGridView1_RowPostPaint(sender As Object, e As DataGridViewRowPostPaintEventArgs) Handles DataGridView1.RowPostPaint Dim Rectangle As Rectangle = New Rectangle(e.RowBounds.Location.X, e.RowBounds.Location.Y, DataGridView1.RowHeadersWid

centos7 vim显示行号

CentOS7下可能有n个账户,让vim显示行号有两种方法:仅让当前用户显示行号和让所有用户显示行号   一.仅让当前用户显示行号 输入命令:vim ~/.vimrc 写入:set nu 保存:wq 手动加载配置: source .vimrc 二.让所有用户显示行号 输入命令:vim /etc/vimrc 在vimrc文件的最后添加:set nu 保存:wq 手动加载配置:source /etc/bashrc 这样不管是哪个用户在vim下都显示行号 参考 https://blog.csdn.ne

pycharm 使用心得(四)显示行号

在PyCharm 里,显示行号有两种办法: 1,临时设置.右键单击行号处,选择 Show Line Numbers. 但是这种方法,只对一个文件有效,并且,重启PyCharm 后消失. 2,永久设置.File --> Settings -->Editor -->Appearance , 之后勾选Show Line Numbers.

pycharm显示行号

在PyCharm 里,显示行号有两种办法: 1,临时设置.右键单击行号处,选择 Show Line Numbers. 但是这种方法,只对一个文件有效,并且,重启PyCharm 后消失. 2,永久设置.File --> Settings -->Editor -->Appearance ,  之后勾选Show Line Numbers.

DataGridView大扩展——显示行号

原文 DataGridView大扩展——显示行号 在DataGridView 的实际使用中,经常需要标示出行号,这样可以比较醒目地看到当前信息.不过DataGridView 在绘制 DataGridViewRow 时没有处理行号,要实现这种效果,需要使用RowPostPaint事件. 主要代码如下: private bool _isShowLineNumber; void DataGridView1_RowPostPaint(object sender, DataGridViewRowPostP