winform让DataGridView显示行号

摘要:
在做一个东西中用到了DataGridView,并且要显示行号及其他操作,所以,在网上搜索了相关资料,小结如下:方法一:我们可以在DataGridView的RowPostPaint事件中进行绘制。具体做法是将DataGridView的RowsHeaderWidthSizeMode属性设置为AutoSizeToAllHeaders或者AutoSizeToDisplayedHeaders,这样自动设置宽度就不会出现行指示符挤压行号的情况了。对于每次DataGridView的行变化,我们都去更新行号,用RowsAdded和RowsRemoved事件。

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

方法一:

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

下面是实现代码:

1、
private void Form1_Load(objectsender, System.EventArgs e)

{

    dataGridView1.Dock =DockStyle.Fill;

    dataGridView1.DataSource =System.Drawing.Imaging.ImageCodecInfo.GetImageDecoders();

}

 

private void dataGridView1_RowPostPaint(objectsender, DataGridViewRowPostPaintEventArgs e)

{

      System.Drawing.Rectangle rectangle = newSystem.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(objectsender, DataGridViewRowPostPaintEventArgs e)         

{             

   try
    {                 
                  //添加行号              
                  SolidBrush v_SolidBrush = newSolidBrush(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

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

免责声明:文章转载自《winform让DataGridView显示行号》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SICP 习题 (1.14)解题总结Confluence安装部署下篇

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

相关文章

DataGridView的DataGridViewComboBoxColumn列点击一次

Winform中的DataGridView数据绑定控件有时会用到ComboBox列,想要显示ComboBox列的内容需要点击两到三次才可以。这使操作变得很麻烦,降低了易用性,尤其是在程序部署在一些小型设备或者触摸屏设备上时,则更为不便。下面介绍两种方法解决这个问题。 首先,我们创建一个Windows应用程序,在窗体中拖拽一个DataGridView控件,命...

C# winform ——界面美化技巧

C# winform 界面美化技巧(扁平化设计) 转 关于C#界面美化的一些小技巧在不使用第三方控件如 IrisSkin 的前提下,依然可以对winform做出让人眼前一亮的美化首先,我们先来实现主界面的扁平化 此处分为两个步骤,第一步是更改winform自带的MainForm窗体属性,第二步是添加窗体事件。将主窗体FormBorderStyle更改...

Winform记录日志信息(Serilog.AspNetCore)

1.注意:必须使用.net Core以上版本的winform才能使用,.Net4.X系列无法使用,建议使用.Net 5创建。 2. 添加ASP.NET Core、Serilog支持   2.1 Nuget 安装相关Nuget包   Microsoft.Extensions.Hosting要指定版本,不能高于2.2.0: Install-Package...

C#Winform 各种控件缩写总结---转载

标准控件1 btn Button2 chk CheckBox3 ckl CheckedListBox4 cmb ComboBox5 dtp DateTimePicker6 lbl Label7 llb LinkLabel8 lst ListBox9 lvw ListView10 mtx MaskedTextBox11 cdr MonthCalendar12...

C#中WinForm程序退出方法技巧总结

C#中WinForm程序退出方法技巧总结 一、关闭窗体 在c#中退出WinForm程序包括有很多方法,如:this.Close();Application.Exit();Application.ExitThread();System.Environment.Exit(0);等他们各自的方法不一样,下面我们就来详细介绍一下。 1.this.Close();只...

转载:winform的DataGridView中用C#实现按钮列置灰

DataGridView 控件包括 DataGridViewButtonCell 类,该类用于显示具有类似按钮的用户界面 (UI) 的单元格。但 DataGridViewButtonCell 不提供禁用由单元格显示的按钮外观的方式。下面的代码示例演示如何自定义 DataGridViewButtonCell 类来显示可以显示为禁用的按钮。本示例定义一个新的单...