转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> C语言系列 >> 正文
[图文]C# DataGridView显示行号的两种方法         ★★★

C# DataGridView显示行号的两种方法

作者:闵涛 文章来源:闵涛的学习笔记 点击数:4183 更新时间:2013/4/14 12:25:59

C# DataGridView显示行号的两种方法

方法一:

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

privatevoiddataGridView1_RowPostPaint(objectsender, DataGridViewRowPostPaintEventArgs e)
         {
            try
             {

       e.Graphics.DrawString((e.RowIndex + 1).ToString(), e.InheritedRowStyle.Font, new SolidBrush(Color.CadetBlue), 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
private void dataGridView1_RowsAdded(objectsender, 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(objectsender, 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();
}
}

以下方法闵涛不推荐使用:

如果DataGridView控件能显示行号,对我们寻找数据就非常方便,但DataGridView默认的属性中,不可设置显示行号。本文在DataGridView的RowPostPaint事件中进行绘制,实现了这个功能,其效果如下:

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

下面是实现代码:

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);
}

[C语言系列]C# 过滤html,js,css代码 正则表达式  [C语言系列]C# WinForm 中Label自动换行 解决方法
[C语言系列]C# 线程调用主线程中的控件  [电脑应用]c# winform 打包部署 自定义界面 或设置开机启动
[C语言系列]C# 和 Linux 时间戳转换  [C语言系列]C#实现 WebBrowser中新窗口打开链接用默认或者指定…
[C语言系列]C#全角和半角转换  [C语言系列]c#WebBrowser查找并选择文本
[C语言系列]C#中实现WebBrowser控件的HTML源代码读写  [C语言系列]C#替换字符串中子串
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    An error occurred on the server when processing the URL. Please contact the system administrator.

    If you are the system administrator please click here to find out more about this error.

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao 信息产业部ICP备案号:鄂ICP备11006601号

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台