• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C# DataGridView:为行头添加行号

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

 最终解决方法

        private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {

            //for (int i = 0; i < e.RowCount; i++)
            //{
            //    dataGridView1.Rows[e.RowIndex].HeaderCell.Value = (e.RowIndex + 1).ToString();
            //}
            for(int i = 0;i<dataGridView1.Rows.Count;i++)
            {
                dataGridView1.Rows[i].HeaderCell.Value = (i+1).ToString();
            }
        }

 

查找到的资料是通过DataGridView的RowPostPaint事件中进行绘制完成。

http://www.cnblogs.com/basicapp/archive/2006/10/07/522851.html

本人对控件绘制不了解,且有评论认为效率不高,所以通过DataGridViewRow.HeaderCell对像来对行头进行操作。

首先了解如何对HeaderCell进行赋值

以下代码,来自MSDN 

(需要注意的是Value接收的是string对象。我开始直接将整形 1 赋值给Value,并将DataGridViewRow.HeaderCell.ValueType设置为Int时,value不显示。)

private void Button6_Click(object sender, System.EventArgs e)
{

    int rowNumber = 1;
    foreach (DataGridViewRow row in dataGridView.Rows)
    {
        if (row.IsNewRow) continue;
        row.HeaderCell.Value = "Row " + rowNumber;
        rowNumber = rowNumber + 1;
    }
    dataGridView.AutoResizeRowHeadersWidth(
        DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders);
}

第二步何时对HeaderCell进行赋值

     private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if(e.ColumnIndex <=0)
            {
                dataGridView1.Rows[e.RowIndex].HeaderCell.Value =(e.RowIndex + 1).ToString();
                
            }
        }

我选择了在格式转化的时候对行号进行赋值

但是有两个缺陷

1.HearderCell 本身不会激活该消息,依靠的是同行第一列单元格。

2.每当其他单元格的内容改变时,或者重新绘制时,该消息总会响应。

从目前的使用来看这两种情况不会对最终效果有负面影响。

但是我想消除这种缺陷。希望在添加行的时候对HeaderCell进行赋值。

在不同情况下有分别有各种的消息达到这一目的:

DataGridView.UserAddedRow Event

用户添加行,情况比较简单,直接对HeadCell进行赋值

private void dataGridView1_UserAddedRow(object sender, DataGridViewRowEventArgs e)
{
    e.Row.HeaderCell.Value = (e.Row.Index + 1).ToString();
}

DataGridView.RowsAdded Event

在程序中添加行的时候情况分为两种

一种是绑定数据以后控件自动添加行(这种情况 DataGridView.RowsAdded ,无法显示正确显示行号)

事实上通过每次添加行后,全部更新一遍行号,而不依赖e.RowIndex,行号也是可以正确显示的。只是复杂度从常数变成了N。

 

一种是通过DataGridView.Rows.Add()添加行,因为此方法总是在最后一样添加新的一行或者多行,所以可以通过以下代码可以成功添加行号

        private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {

            for (int i = 0; i < e.RowCount; i++)
            {
                dataGridView1.Rows[e.RowIndex].HeaderCell.Value = (e.RowIndex + 1).ToString();
            }
           
        }    

但是如果使用DataGridView.Rows.Insert()添加行时,以上方法不可行,因为已添加行的行号发生了改变,需要重新更改所有的行头。

        private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {

            //for (int i = 0; i < e.RowCount; i++)
            //{
            //    dataGridView1.Rows[e.RowIndex].HeaderCell.Value = (e.RowIndex + 1).ToString();
            //}
            for(int i = 0;i<dataGridView1.Rows.Count;i++)
            {
                dataGridView1.Rows[i].HeaderCell.Value = (i).ToString();
            }
        }

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#面向对象设计模式学习笔记(5)-Prototype原型模式(创建型模式)发布时间:2022-07-10
下一篇:
C#从http上拿返回JSON数据发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap