2012-03-06 7 views
30

È possibile visualizzare il numero di riga nell'intestazione di riga di un DataGridView?Mostra il numero di riga nell'intestazione di riga di un DataGridView

sto cercando con questo codice, ma non funziona:

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

Devo impostare alcune DataGridView proprietà?

risposta

36

Sembra che non lo trasformi in una stringa. Prova

row.HeaderCell.Value = String.Format("{0}", row.Index + 1); 
+1

Non sicuro che tutti facciano questo: non potrei impostare il valore di HeaderCell prima di Form_Load() - che è in CTOR del modulo. –

40

È anche possibile disegnare la stringa in modo dinamico all'interno della manifestazione 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); 
} 
+0

Grazie signore !!. Questo ha funzionato per me, niente ha funzionato sopra a tutti –

+1

Non dovrebbe essere 'grid.font' nella chiamata a' DrawString'? – Spencer

9

Grazie @ Gabriel-Perez e @Groo, grande idea! Nel caso in cui altri lo vogliano, ecco una versione in VB testata in Visual Studio 2012. Nel mio caso volevo che i numeri comparissero in alto a destra allineati nell'intestazione di riga.

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 

È anche possibile ottenere il carattere predefinito, rowFont = grid.RowHeadersDefaultCellStyle.Font, ma potrebbe non apparire come bene. Lo screenshot qui sotto utilizza il font Tahoma.

Example on windows 7

+1

Anche questa opzione sembra avere il netto vantaggio di non annullare automaticamente la condivisione delle righe (rispetto a row.HeaderCell.Value, che lo fa). Sebbene sia altrimenti molto facile da annullare la condivisione delle righe, è vantaggioso per le prestazioni cercare di preservarle laddove possibile per insiemi di dati di grandi dimensioni in base alla [Documentazione] (https://msdn.microsoft.com/en-us/library/ha5xt0d9 (v = vs.110) .aspx). – Finch042

+0

La migliore risposta finora. Ho armeggiato un po 'con la formattazione. Ho cambiato in FontStyle.Regular, e.RowBounds.Top + 3, e.RowBounds.Height-3 e SystemBrushes.InactiveCaptionText. Sembra davvero buono ora. –

+0

Questo non prende in considerazione l'ordinamento. inizierà sempre con 1,2,3 .... Esiste un'opzione che mantiene il 'numero di riga originale' anche dopo l'ordinamento delle colonne? –

4

si può fare questo:

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

dgv.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders); 

    } 
+0

Questo non sembra funzionare. –

+1

questo ha funzionato per me – ako

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

questo ha funzionato per me.

5

solo migliorando sopra soluzione .. così intestazione è di per sé ridimensionare la sua larghezza al fine di accogliere lunga stringa del tipo 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); 
      } 
1

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

quando applicato su datagridview con un numero molto elevato di righe crea una perdita di memoria e alla fine causerà un problema di memoria insufficiente. Qualche idea su come recuperare la memoria?

Ecco un codice di esempio da applicare a una griglia vuota con alcune colonne. semplicemente aggiunge righe e numeri all'indice. Ripeti il ​​clic del pulsante alcune volte.

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

In ritardo, ma forse aiuterà qualcun altro. La soluzione per impostare il DGV in modalità virtuale. https://msdn.microsoft.com/en-us/library/15a31akc(v=vs.110).aspx – MtnManChris

0

Un po 'tardi, ma ho usato VB.NET e in RowPostPaint evento è NON buona idea, perché ho avuto ciclo infinito. Utilizzare il pulsante o il codice posto in cui si collega il database a DataGridView.