2012-03-06 77 views
30

是否可以在DataGridView的行標題中顯示行號?在DataGridView的行標題中顯示行號

我這個代碼很努力,但它不工作:

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

我必須設置一些DataGridView財產?

回答

36

它似乎沒有把它變成一個字符串。 嘗試

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

不確定每個人都會遇到這種情況:我無法在Form_Load()之前設置HeaderCell的值 - 即在窗體的CTOR中。 – 2016-06-17 18:24:45

40

您還可以動態繪製的字符串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

謝謝先生!這對我有效,上面沒有任何工作 – 2017-04-25 12:59:03

+1

不應該在'DrawString'的調用中調用'grid.font'嗎? – Spencer 2017-08-09 16:42:17

9

感謝@加布裏埃爾 - 佩雷斯和@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 

您還可以得到默認字體,rowFont = grid.RowHeadersDefaultCellStyle.Font,但它可能看起來不那麼好。以下屏幕截圖使用的是Tahoma字體。

Example on windows 7

+1

這個選項似乎也有不自動取消共享行的獨特優勢(vs. row.HeaderCell.Value,它的確如此)。儘管非共享行非常容易,但根據[Documentation](https://msdn.microsoft.com/zh-cn/library/ha5xt0d9(可能爲英文網頁)),嘗試在大數據集可能的情況下嘗試保留它們對於性能是有利的v = vs.110)的.aspx)。 – Finch042 2015-07-13 10:37:32

+0

到目前爲止最好的答覆。我修改了一下格式。我更改爲FontStyle.Regular,e.RowBounds.Top + 3,e.RowBounds.Height-3和SystemBrushes.InactiveCaptionText。現在看起來非常好。 – 2016-02-09 20:37:16

+0

這不考慮排序。它將始終以1,2,3開頭....是否有一個選項可以在列分類之後保留「原始行號」? – 2018-01-22 15:24:09

4

,你可以這樣做:

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

dgv.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders); 

    } 
+0

這似乎不起作用。 – 2014-04-02 20:02:05

+1

這對我有用 – ako 2016-07-25 19:25:39

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

這爲我工作。

5

只是增強上述溶液..所以頭它自調整其寬度,以便適應長度的字符串等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;

當在datagridview上應用大量行時會產生內存泄漏並最終導致內存不足問題。任何想法如何回收內存?

以下是適用於具有某些列的空網格的示例代碼。它只是添加行併爲索引編號。重複按鈕點擊幾次。

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

有點晚了,但也許它會幫助別人。將DGV設置爲虛擬模式的解決方案。 https://msdn.microsoft.com/en-us/library/15a31akc(v=vs.110).aspx – MtnManChris 2016-12-27 17:20:04

0

有點晚,但我用VB.NET RowPostPaint事件好主意,因爲我已經死循環。使用按鈕或放置代碼將數據庫鏈接到DataGridView的位置。