C# DataGridView:为行头添加行号

 最终解决方法

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

 

 

posted @ 2017-07-13 16:15  连山In17  阅读(14417)  评论(0编辑  收藏  举报