DataGridView添加行号
自己在做WINFORM小玩意的时候需要在datagridview上显示行号,上网搜索一下,找到如下
代码,不错,先记录下来了。
在RowPostPaint事件中画出来
C#代码
1. // 绘制行号
2. private void gvdata_RowPostPaint(object sender, DataGridViewRowPostPaintE
ventArgs e)
3. {
4. try
5. {
6.
7. Rectangle rectangle = new Rectangle(e.RowBounds.Location.X, 8.
9. Convert.ToInt32(e.RowBounds.Location.Y + (e.RowBounds.Height - gvdata.RowHeade
rsDefaultCellStyle.Font.Size) / 2), 10.
11. gvdata.RowHeadersWidth - 4, e.RowBounds.Height);
12.
13. TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(),
14.
15. gvdata.RowHeadersDefaultCellStyle.Font, rectangle, gvdata.RowHeadersDefaultCellSt
yle.ForeColor,
16.
17. TextFormatFlags.Right); 18.
19.
20.
21. }
22.
23. catch (Exception ex)
24. {
25.
26. Console.Write("dgv1_RowPostPaint:" + ex.Message); 27.
28. }
29. }
效果如图:
/*
#region dataGridView //显示行号
private void dataGridView_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
Rectangle rectangle = new Rectangle(e.RowBounds.Location.X,
e.RowBounds.Location.Y,
dataGridView.RowHeadersWidth - 8,
e.RowBounds.Height);
TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(),
dataGridView.RowHeadersDefaultCellStyle.Font,
rectangle,
dataGridView.RowHeadersDefaultCellStyle.ForeColor,
TextFormatFlags.VerticalCenter | TextFormatFlags.Right);
}
#endregion
private void dataGridView_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
try
{ //添加行号
SolidBrush v_SolidBrush = new
SolidBrush(dataGridView.RowHeadersDefaultCellStyle.ForeColor);
int v_LineNo = 0;
v_LineNo = e.RowIndex + 1;
string v_Line = v_LineNo.ToString();
e.Graphics.DrawString(v_Line, e.InheritedRowStyle.Font, v_SolidBrush,
e.RowBounds.Location.X + 15, e.RowBounds.Location.Y + 5);
}
catch (Exception ex)
{
MessageBox.Show("添加行号时发生错误,错误信息:" + ex.Message, "操作失败");
}
}
*/
人云亦云,我为DataGridView控件显示行号正名
前些天在写个小程序,用到DataGridView,想给它动态的显示行号。不是很费劲GOOGLE了一下,
这GOOGLE不要紧,发现了不少问题。以下基本上都是GOOGLE搜索出来的网上的一些解决方法,千
篇一律都是这样的:
private void DataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
for (int i = 0; i < e.RowCount; i++)
{
this.dgvKBRollUp.Rows[e.RowIndex + i].HeaderCell.Style.Alignment =
DataGridViewContentAlignment.MiddleRight;
this.dgvKBRollUp.Rows[e.RowIndex + i].HeaderCell.Value =
(e.RowIndex + i + 1).ToString();
}
for (int i = e.RowIndex + e.RowCount; i < this.dgvKBRollUp.Rows.Count; i++)
{
this.dgvKBRollUp.Rows[i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;
this.dgvKBRollUp.Rows[i].HeaderCell.Value = (i + 1).ToString();
}
}
private void DataGridView1_RowsRemoved(object sender,
DataGridViewRowsRemovedEventArgs e)
{
for (int i = 0; i < e.RowCount; i++)
{
this.dgvKBRollUp.Rows[e.RowIndex + i].HeaderCell.Style.Alignment =
DataGridViewContentAlignment.MiddleRight;
this.dgvKBRollUp.Rows[e.RowIndex + i].HeaderCell.Value =
(e.RowIndex + i + 1).ToString();
}
for (int i = e.RowIndex + e.RowCount; i < this.dgvKBRollUp.Rows.Count; i++)
{
this.dgvKBRollUp.Rows[i].HeaderCell.Style.Alignment =
DataGridViewContentAlignment.MiddleRight;
this.dgvKBRollUp.Rows[i].HeaderCell.Value = (i +
1).ToString();
}
}
只要用过这段代码的人就应该发现这段代码是运行出错的。原因就出在RowsRemoved事件里,会抛出一个Index outof range的异常。然而就是这么一段有错的代码,几乎充斥着整个互联网,千篇一律的COPY,没有一个人纠正。
先说下这段代码出错的原因吧:
在RowsRemoved事件里,最开始生成DataGridView的数据的时候,也是会触发这个事件的。这个时候DataGridView控件的Rows.Count就是0。那下面这行代码就有问题了:
this.dgvKBRollUp.Rows[e.RowIndex + i].HeaderCell.Style.Alignment =
DataGridViewContentAlignment.MiddleRight;
e.RowIndex + i,这里对应的是Rows[0],但是Rows.Count还是0啊,Rows[0]是不存在的。要存在Rows[0]起码DataGridView控件要有一行才行。为了避免这个错误,小小的修改代码就行了:
private void dgvKBRollUp_RowsRemoved(object sender,
DataGridViewRowsRemovedEventArgs e)
{
if (dgvKBRollUp.Rows.Count != 0)
{
for (int i = 0; i < e.RowCount; i++)
{
this.dgvKBRollUp.Rows[e.RowIndex +
i].HeaderCell.Style.Alignment =
DataGridViewContentAlignment.MiddleRight;
this.dgvKBRollUp.Rows[e.RowIndex + i].HeaderCell.Value = (e.RowIndex + i + 1).ToString();
}
for (int i = e.RowIndex + e.RowCount; i < this.dgvKBRollUp.Rows.Count; i++)
{
this.dgvKBRollUp.Rows[i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;
this.dgvKBRollUp.Rows[i].HeaderCell.Value = (i + 1).ToString();
}
}
只要加上一个对Rows.Count的判断就可以避免这个错误。希望网上的一些COPY的朋友也要注意了,以
后COPY过来的时候,自己还是要动手验证一下。将一个错误的信息胡乱的传播是对一些新手以及自己都
不怎么好的。
最后附上微软MSDN里面关于e.RowIndex和e.RowCount的一段代码:
System.Text.StringBuilder messageBoxCS = new System.Text.StringBuilder();
messageBoxCS.AppendFormat("{0} = {1}", "RowIndex", e.RowIndex);
messageBoxCS.AppendLine();
messageBoxCS.AppendFormat("{0} = {1}", "RowCount", e.RowCount);
messageBoxCS.AppendLine();
MessageBox.Show(messageBoxCS.ToString(), "RowsRemoved Event");
通过这段代码你可以很轻松地跟踪事件参数里的e.RowIndex和e.RowCount的值。当然你可以DEBUG,
一样的。我就是DEBUG的?O(?_?)O~