C# DataGridView显示行号的三种方法 (转载)

摘要:
varrowIdx=(e.RowIndex+1).ToString();i++){dataGridView1.Rows[e.RowIndex+i].HeaderCell.Style.Aalignment=DataGridViewContentAlignment.Middleeft;
C# DataGridView显示行号的三种方法(转载)

源贴地址:https://blog.csdn.net/xieyufei/article/details/9769631

方法一:

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

但是这种方法在大数据量的时候性能比较差,每次滚动数据都会触发RowPostPaint事件。

private void dgGrid_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
    var grid = sender as DataGridView;
    var rowIdx = (e.RowIndex + 1).ToString();
 
    var centerFormat = new StringFormat() 
    { 
        // right alignment might actually make more sense for numbers
        Alignment = StringAlignment.Center, 
        LineAlignment = StringAlignment.Center
    };
 
    var headerBounds = new Rectangle(e.RowBounds.Left, e.RowBounds.Top, grid.RowHeadersWidth, e.RowBounds.Height);
    e.Graphics.DrawString(rowIdx, this.Font, SystemBrushes.ControlText, headerBounds, centerFormat);
}

方法二:

我的做法是给每行的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.Middleleft;
                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.Middleleft;
                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.Middleleft;
                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.Middleleft;
                dataGridView1.Rows[i].HeaderCell.Value = (i + 1).ToString();
            }
        }
方法三:
对于ReadOnly的Display,有更为简便的方法
代码如下:
1  private void dataGridView1_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
2         {
3             e.Row.HeaderCell.Value = string.Format("{0}", e.Row.Index + 1);
4         }   

免责声明:文章转载自《C# DataGridView显示行号的三种方法 (转载)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java String类型数据的字节长度Python机器学习(6)——逻辑回归分类下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

AWT初步— 事件处理模型

之前学习的内容只能形成一个用户界面,而用户不能对其有实际的操作,也就是说用户界面没有任何功能。要能够让图形界面接收用户的操作,就必须给各个组件加上事件处理机制。在事件处理的过程中,主要涉及三类对象: Event-事件,用户对界面操作在java语言上的描述,以类的形式出现,例如键盘操作对应的事件类是KeyEvent。  Event Source-事件源,事...

Winform的控件以及DataGridView的一般使用

先上学习测试的一些截图 1:获取多个控件上面的值(checkbox,combobox,textbox,radiobutton) 2:获取到选择行的主键ID的value,方便我们进一步CURD 3:获取选择一行的数据以及一行是多少列 4:绑定显示自定义的列头名称 5:选中一行的属性设置操作  6:全部代码 1 using System;...

thinkphp过滤xss

什么是XSS:这里通俗的讲,就像是SQL注入一样,XSS攻击也可以算是对HTML和JS的一种注入。你本来希望得到是从用户那得到一段有用的文本文字,但用户提交给你的却是别有用心的可执行javasc ript或其它脚本(这里并没有把破坏样式或文档文本当作攻击),当你再把这些提交的内容显示到页面上时,XSS攻击就发生了。 关于XSS的攻击方式和场景层出不穷,本...

C#中 System.Threading.Timer 的回收问题

一. 问题来源 在我上家公司里,做停车软件客户端的时候,岗亭客户端需要每隔一段时间,将本地时间和服务所在的电脑上的时间,和中央服务器上的本地时间进行同步。但是在实际运用的时候,打开客户端除了开启计时器(System.Threading.Timer)的时候会同步一次以外,之后就再也不会同步。 二. 关于 System.Threading.Timer Syst...

C#:总结页面传值几种方法

 小知识点: 1.  W7自带 .NetFrameWork 3.5, 兼容模式为 高版本号兼容低版本号; 2. WF和WPF都是基于XAML的,可是两者的用途不同。 WF是一种开发框架,将工作流嵌入在.NET Framework应用程序中,所主要用于开发创建工作流应用程序。WF:http://msdn.microsoft.com/zh-cn/librar...

[SAP ABAP开发技术总结]面向对象OO

由于历史遗留原因,很多项目也还在使用老的ABAP过程化语句进行开发,但新的SAP很多的东西都已经通过类来实现了,比如BAPI(比类还早)、BADI、ALV,还有很多东西都了已经通过类来重写了,所以为了与时俱进,还是使用类吧 2.      面向对象... 27 2.1.           类与接口定义... 27 2.1.1.        compo...