C# 在 DataGridView 的行标题中显示行号
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9581626/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Show row number in row header of a DataGridView
提问by davioooh
Is it possible to show row number in the row header of a DataGridView?
是否可以在 a 的行标题中显示行号DataGridView?
I'm trying with this code, but it doesn't work:
我正在尝试使用此代码,但它不起作用:
private void setRowNumber(DataGridView dgv)
{
foreach (DataGridViewRow row in dgv.Rows)
{
row.HeaderCell.Value = row.Index + 1;
}
}
Do I have to set some DataGridViewproperty?
我必须设置一些DataGridView属性吗?
采纳答案by mihZR
It seems that it doesn't turn it into a string. Try
似乎它没有把它变成一个字符串。尝试
row.HeaderCell.Value = String.Format("{0}", row.Index + 1);
回答by Gabriel Perez
You can also draw the string dynamically inside the RowPostPaintevent:
您还可以在RowPostPaint事件内动态绘制字符串:
private void dgGrid_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
var grid = sender as DataGridView;
var rowIdx = (e.RowIndex + 1).ToString();
var centerFormat = new StringFormat()
{
// right alignment might actually make more sense for numbers
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center
};
var headerBounds = new Rectangle(e.RowBounds.Left, e.RowBounds.Top, grid.RowHeadersWidth, e.RowBounds.Height);
e.Graphics.DrawString(rowIdx, this.Font, SystemBrushes.ControlText, headerBounds, centerFormat);
}
回答by Rob Sherratt
Thanks @Gabriel-Perez and @Groo, great idea! In case others want it, here's a version in VB tested in Visual Studio 2012. In my case I wanted the numbers to appear top right aligned in the Row Header.
谢谢@Gabriel-Perez 和@Groo,好主意!如果其他人需要它,这里有一个在 Visual Studio 2012 中测试过的 VB 版本。在我的情况下,我希望数字在行标题中显示为右上角对齐。
Private Sub MyDGV_RowPostPaint(sender As Object, _
e As DataGridViewRowPostPaintEventArgs) Handles MyDataGridView.RowPostPaint
' Automatically maintains a Row Header Index Number
' like the Excel row number, independent of sort order
Dim grid As DataGridView = CType(sender, DataGridView)
Dim rowIdx As String = (e.RowIndex + 1).ToString()
Dim rowFont As New System.Drawing.Font("Tahoma", 8.0!, _
System.Drawing.FontStyle.Bold, _
System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Dim centerFormat = New StringFormat()
centerFormat.Alignment = StringAlignment.Far
centerFormat.LineAlignment = StringAlignment.Near
Dim headerBounds As Rectangle = New Rectangle(_
e.RowBounds.Left, e.RowBounds.Top, _
grid.RowHeadersWidth, e.RowBounds.Height)
e.Graphics.DrawString(rowIdx, rowFont, SystemBrushes.ControlText, _
headerBounds, centerFormat)
End Sub
You can also get the default font, rowFont = grid.RowHeadersDefaultCellStyle.Font, but it might not look as good. The screenshot below is using the Tahoma font.
您还可以获取默认字体rowFont = grid.RowHeadersDefaultCellStyle.Font,但它可能看起来不那么好。下面的屏幕截图使用的是 Tahoma 字体。


回答by Alireza815
you can do this :
你可以这样做 :
private void setRowNumber(DataGridView dgv)
{
foreach (DataGridViewRow row in dgv.Rows)
{
row.HeaderCell.Value = row.Index + 1;
}
dgv.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders);
}
回答by timthez
private void setRowNumber(DataGridView dgv)
{
foreach (DataGridViewRow row in dgv.Rows)
{
row.HeaderCell.Value = (row.Index + 1).ToString();
}
}
This worked for me.
这对我有用。
回答by sm.abdullah
just enhancing above solution.. so header it self resize its width in order to accommodate lengthy string like 12345
只是增强上述解决方案.. 所以标题它会自动调整其宽度以适应像 12345 这样的长字符串
private void advancedDataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
var grid = sender as DataGridView;
var rowIdx = (e.RowIndex + 1).ToString();
var centerFormat = new StringFormat()
{
// right alignment might actually make more sense for numbers
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center
};
//get the size of the string
Size textSize = TextRenderer.MeasureText(rowIdx, this.Font);
//if header width lower then string width then resize
if (grid.RowHeadersWidth < textSize.Width + 40)
{
grid.RowHeadersWidth = textSize.Width + 40;
}
var headerBounds = new Rectangle(e.RowBounds.Left, e.RowBounds.Top, grid.RowHeadersWidth, e.RowBounds.Height);
e.Graphics.DrawString(rowIdx, this.Font, SystemBrushes.ControlText, headerBounds, centerFormat);
}
回答by Samir Emdanat
row.HeaderCell.Value = row.Index + 1;
row.HeaderCell.Value = row.Index + 1;
when applied on datagridview with a very large number of rows creates a memory leak and eventually will result in an out of memory issue. Any ideas how to reclaim the memory?
当应用于具有大量行的 datagridview 时,会导致内存泄漏并最终导致内存不足问题。任何想法如何回收内存?
Here is sample code to apply to an empty grid with some columns. it simply adds rows and numbers the index. Repeat button click a few times.
这是应用于具有某些列的空网格的示例代码。它只是添加行并为索引编号。重复按钮点击几次。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
dataGridView1.SuspendLayout();
for (int i = 1; i < 10000; i++)
{
dataGridView1.Rows.Add(i);
}
dataGridView1.ResumeLayout();
}
private void button1_Click(object sender, EventArgs e)
{
foreach (DataGridViewRow row in dataGridView1.Rows)
row.HeaderCell.Value = (row.Index + 1).ToString();
}
}
回答by suriyadi
This worked for me.
这对我有用。
Private Sub GridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles GridView1.CellFormatting
Dim idx As Integer = e.RowIndex
Dim row As DataGridViewRow = VDataGridView1.Rows(idx)
Dim newNo As Long = idx
If Not _RowNumberStartFromZero Then
newNo += 1
End If
Dim oldNo As Long = -1
If row.HeaderCell.Value IsNot Nothing Then
If IsNumeric(row.HeaderCell.Value) Then
oldNo = CLng(row.HeaderCell.Value)
End If
End If
If newNo <> oldNo Then 'only change if it's wrong or not set
row.HeaderCell.Value = newNo.ToString()
row.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight
End If
End Sub
回答by suriyadi
This work in C#:
这项工作在C# 中:
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
int idx = e.RowIndex;
DataGridViewRow row = dataGridView1.Rows[idx];
long newNo = idx;
if (!_RowNumberStartFromZero)
newNo += 1;
long oldNo = -1;
if (row.HeaderCell.Value != null)
{
if (IsNumeric(row.HeaderCell.Value))
{
oldNo = System.Convert.ToInt64(row.HeaderCell.Value);
}
}
if (newNo != oldNo)
{
row.HeaderCell.Value = newNo.ToString();
row.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;
}
}
回答by M. Fawad Surosh
private void ShowRowNumber(DataGridView dataGridView)
{
dataGridView.RowHeadersWidth = 50;
for (int i = 0; i < dataGridView.Rows.Count; i++)
{
dataGridView.Rows[i].HeaderCell.Value = (i + 1).ToString();
}
}

