Показать номер строки в заголовке строки DataGridView - PullRequest
39 голосов
/ 06 марта 2012

Возможно ли показать номер строки в заголовке строки DataGridView?

Я пытаюсь использовать этот код, но он не работает:

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

Нужно ли устанавливать какое-либо свойство DataGridView?

Ответы [ 10 ]

53 голосов
/ 11 октября 2012

Вы также можете динамически нарисовать строку внутри события 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);
}
47 голосов
/ 06 марта 2012

Кажется, он не превращается в строку.Попробуйте

row.HeaderCell.Value = String.Format("{0}", row.Index + 1);
9 голосов
/ 26 июня 2014
private void setRowNumber(DataGridView dgv)
{
    foreach (DataGridViewRow row in dgv.Rows)
    {
        row.HeaderCell.Value = (row.Index + 1).ToString();
    }
}

Это сработало для меня.

9 голосов
/ 17 февраля 2013

Спасибо @ Gabriel-Perez и @Groo, отличная идея!На случай, если другие захотят, вот версия на VB, протестированная в Visual Studio 2012. В моем случае я хотел, чтобы числа отображались по верхнему правому краю в заголовке строки.

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

Вы также можете получить шрифт по умолчанию, rowFont = grid.RowHeadersDefaultCellStyle.Font, но это может выглядеть не так хорошо.На снимке экрана ниже показан шрифт Tahoma.

Example on windows 7

6 голосов
/ 12 июня 2015

просто улучшаем вышеприведенное решение .. поэтому заголовок сам изменяет размер своей ширины, чтобы вместить длинную строку, такую ​​как 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);
}
4 голосов
/ 26 октября 2013

вы можете сделать это:

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

    dgv.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders);

}
1 голос
/ 04 апреля 2016

row.HeaderCell.Value = row.Index + 1;

при применении к сетке данных с очень большим числом строк создает утечку памяти и в конечном итоге приводит к проблеме нехватки памяти.Любые идеи, как восстановить память?

Вот пример кода для применения к пустой сетке с некоторыми столбцами.он просто добавляет строки и нумерует индекс.Повторите нажатие кнопки несколько раз.

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();
    }
}
0 голосов
/ 15 марта 2019
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();
   }
}
0 голосов
/ 14 ноября 2018

Эта работа, в 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;
        }
    }
0 голосов
/ 14 ноября 2018

Это сработало для меня.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...