在DataGridView的行标题中显示行号

dav*_*ooh 42 .net c# datagridview winforms

是否可以在行标题中显示行号DataGridView

我正在尝试使用此代码,但它不起作用:

    private void setRowNumber(DataGridView dgv)
    {
        foreach (DataGridViewRow row in dgv.Rows)
        {
            row.HeaderCell.Value = row.Index + 1;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我必须设置一些DataGridView房产吗?

小智 56

您还可以在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);
}
Run Code Online (Sandbox Code Playgroud)

  • 调用“DrawString”时不应该是“grid.font”吗? (2认同)
  • 从性能角度来看,这优于为每行设置“row.HeaderCell.Value”。 (2认同)

小智 48

它似乎没有把它变成一个字符串.尝试

row.HeaderCell.Value = String.Format("{0}", row.Index + 1);
Run Code Online (Sandbox Code Playgroud)


小智 10

谢谢@ 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
Run Code Online (Sandbox Code Playgroud)

您也可以获得默认字体rowFont = grid.RowHeadersDefaultCellStyle.Font,但它可能看起来不太好.下面的截图是使用Tahoma字体.

Windows 7上的示例

  • @JohnGrabanski那么它不会是行号,它会是与该行关联的数据。为此,通常最好添加一列来保存该数据。 (2认同)

小智 9

private void setRowNumber(DataGridView dgv)
{
    foreach (DataGridViewRow row in dgv.Rows)
    {
        row.HeaderCell.Value = (row.Index + 1).ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

这对我有用.


sm.*_*lah 7

只是增强上面的解决方案..所以标题自我调整其宽度,以容纳像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);
}
Run Code Online (Sandbox Code Playgroud)