2012-03-06 15 views
30

Có thể hiển thị số hàng trong tiêu đề hàng của DataGridView không?Hiển thị số hàng trong tiêu đề hàng của một DataGridView

Tôi đang cố gắng với mã này, nhưng nó không hoạt động:

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

Tôi có phải thiết lập một số tài sản DataGridView?

Trả lời

36

Dường như nó không biến thành chuỗi. Hãy thử

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

Không chắc chắn mọi người phải đối mặt với điều này: Tôi không thể đặt giá trị của HeaderCell trước Form_Load() - đó là trong CTOR của biểu mẫu. –

40

Bạn cũng có thể rút ra những chuỗi động bên trong sự kiện 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

Cảm ơn ngài !! Điều này làm việc cho tôi, không có gì ở trên làm việc tại tất cả –

+1

Không phải là nó 'grid.font' trong các cuộc gọi đến' DrawString'? – Spencer

9

Cảm ơn @ Gabriel-Perez và @Groo, ý tưởng tuyệt vời! Trong trường hợp những người khác muốn nó, đây là một phiên bản trong VB thử nghiệm trong Visual Studio 2012. Trong trường hợp của tôi, tôi muốn các con số xuất hiện trên bên phải liên kết trong Row Header.

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 

Bạn cũng có thể nhận phông chữ mặc định, rowFont = grid.RowHeadersDefaultCellStyle.Font nhưng có thể không tốt. Ảnh chụp màn hình bên dưới đang sử dụng phông chữ Tahoma.

Example on windows 7

+1

Tùy chọn này cũng dường như có lợi thế riêng biệt của việc không tự động chia sẻ các hàng (so với row.HeaderCell.Value). Mặc dù nó rất dễ dàng để chia sẻ các hàng, nhưng nó có lợi cho hiệu suất để cố gắng giữ chúng ở nơi có thể cho các tập dữ liệu lớn theo [Tài liệu] (https://msdn.microsoft.com/en-us/library/ha5xt0d9 (v = vs.110) .aspx). – Finch042

+0

Câu trả lời hay nhất cho đến nay. Tôi leng keng với định dạng một chút. Tôi đã thay đổi thành FontStyle.Regular, e.RowBounds.Top + 3, e.RowBounds.Height-3 và SystemBrushes.InactiveCaptionText. Nó trông thực sự tốt bây giờ. –

+0

Điều này không tính đến việc phân loại. nó sẽ luôn bắt đầu với 1,2,3 .... Có tùy chọn nào giữ 'số hàng gốc' ngay cả sau khi sắp xếp cột không? –

4

bạn có thể làm điều này:

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

dgv.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders); 

    } 
+0

Điều này có vẻ không hoạt động. –

+1

điều này làm việc cho tôi – ako

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

này đã làm việc cho tôi.

5

chỉ tăng cường trên giải pháp .. vì vậy tiêu đề nó tự thay đổi kích thước chiều rộng của nó để chứa chuỗi dài như 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;

khi áp dụng trên datagridview với số lượng hàng lớn tạo ra rò rỉ bộ nhớ và cuối cùng sẽ dẫn đến sự cố hết bộ nhớ. Bất kỳ ý tưởng làm thế nào để đòi lại bộ nhớ?

Đây là mã mẫu để áp dụng cho lưới trống với một số cột. nó chỉ đơn giản thêm hàng và số chỉ mục. Nút lặp lại nhấp một vài lần.

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

Bit trễ, nhưng có lẽ nó sẽ giúp người khác. Giải pháp để đặt DGV thành chế độ ảo. https://msdn.microsoft.com/en-us/library/15a31akc(v=vs.110).aspx – MtnManChris

0

Một chút trễ, nhưng tôi sử dụng VB.NET và trong RowPostPaint EventKHÔNG ý tưởng tốt, bởi vì tôi đã có vòng lặp vô tận. Sử dụng nút hoặc mã nơi bạn liên kết cơ sở dữ liệu với DataGridView.