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