2012-03-06 68 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

誰もがこれに直面しているとは確かではありません.Former_Load()の前にHeaderCellの値を設定できませんでした。これはフォームのCTORにあります。 –

40

をお試しくださいまた、RowPostPaintイベント内で動的に文字列を描くことができます:ガブリエル・ペレスと@Groo、素晴らしいアイデア@

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

ありがとうございました!!これは私にとってはうまくいったが、上では何も働かなかった –

+1

'DrawString'の呼び出しで' grid.font'にしてはいけないのですか? – Spencer

9

感謝を!他の人が望む場合は、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

+1

このオプションは、行を自動的に共有しないという明白な利点も持っているようです(対row.HeaderCell.Value)。行の共有を解除するのは非常に簡単ですが、[ドキュメント](https://msdn.microsoft.com/en-us/library/ha5xt0d9(英語))に従って、大量のデータセットを可能な限り保存することがパフォーマンスにとって有益ですv = .110).aspx)。 – Finch042

+0

これまでのところ最良の答えです。私はちょっとした書式づけをした。私はFontStyle.Regular、e.RowBounds.Top + 3、e.RowBounds.Height-3、およびSystemBrushes.InactiveCaptionTextに変更しました。今は本当にいいよね。 –

+0

これはソートを考慮していません。それは常に1,2,3 ....で始まります。列ソート後も「元の行番号」を保持するオプションはありますか? –

4

あなたはこれを行うことができます。

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

dgv.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders); 

    } 
+0

これは動作していません。 –

+1

これは私のために働いた – ako

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

0

、私はVB.NETを使用してRowPostPaintイベントで、私は無限ループを持っていたので、ませ良いアイデアです。 DataGridViewにデータベースをリンクするボタンまたはプレースコードを使用します。

関連する問題