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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM