2009-08-12 19 views
7

DataTableにリンクされた単純なDataGridViewを表示しようとしていますが、最終的にDataTableの最初の列をDataGridViewの行ヘッダーセルにします。この時点で、私は行ヘッダーセルに値を持つことで解決します。すべての行と列、および列ヘッダーセルを持つDataGridViewを表示できますが、行ヘッダーセルは表示できません。私はrow.HeaderCell.Valueの値をチェックし、そこに置くデータはそこにあります。私はrow.HeaderCell.Displayedとfalseですが、これは読み取り専用なので、私はそれを真実にすることはできませんチェックします。行ヘッダーセルを表示するにはどうすればよいですか?DataGridViewは行ヘッダーセルを表示します

ここで私は仕事にこれを取得しようとしてきたものの簡単なサンプルです:

 DataTable table = new DataTable(); 
     for (int i = 0; i<10; i++) 
     { 
      table.Columns.Add(new DataColumn("column-" + i)); 
     } 

     for (int i = 0; i < 10; i++) 
     { 
      DataRow theRow = table.NewRow(); 

      for (int j = 0; j < 10; j++) 
       theRow[j] = i + "-" + j; 
      table.Rows.Add(theRow); 

     } 

     dataGridView1.DataSource = table; 
     dataGridView1.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders; 
     int rowNumber = 1; 
     foreach (DataGridViewRow row in dataGridView1.Rows) 
     { 
      if (row.IsNewRow) continue; 
      row.HeaderCell.Value = "Row " + rowNumber; 
      rowNumber = rowNumber + 1; 
     } 
     dataGridView1.AutoResizeRowHeadersWidth(
      DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders); 

答えて

1

答えはDataGridView.CellFormattingイベントを処理するように見えます。他の場所で値を設定してもうまくいかないのはなぜですか?私には理由があると確信しています。私は次のイベントハンドラを追加して、すべてがうまくいきます:

private void dataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
    { 
     DataGridView gridView = sender as DataGridView; 

     if (null != gridView) 
     { 

      gridView.Rows[e.RowIndex].HeaderCell.Value = gridView.Rows[e.RowIndex].Cells[0].Value; 
      Console.WriteLine("GridViewCell: " + gridView.Rows[e.RowIndex].Cells[0].Value); 

     } 
    } 
+0

これは何らかのバグだと思います。 VB.NETでは、必要に応じて 'HeaderCell.Value'を設定することができます。しかし、あなたはC#であなたの仕事に頼る必要があります。 –

+2

これはコンストラクタからコードが実行されたためです。コードをLoadイベントまたは他のイベントハンドラに移動します。 – AMissico

+0

これはすべての列に対して呼び出されるため、少し無駄です。 HeaderCell.Valueを設定する前にe.ColumnIndex == 0をチェックするように変更したい場合があります。 –

9

このコードをコンストラクタに配置すると、動作しません。フォームのLoadイベントにコードを移動し、正常に動作するはずです。 Windows.FormsとC#のよくある問題は、コンストラクタで不適切な初期化を使用することです。多くのコントロールは、コンストラクターが終了するまで完全には作成されません。 (理由は忘れていますが、ハンドルはまだ作成されていないためだと思います)LoadイベントでMicrosoftの推奨どおりに初期化すると、多くの「回避策」を回避できます。

1

、いずれかの結合によって、または手動でのDataGridViewに値を割り当てた後、私は次のようでした:

foreach (DataGridViewRow row in dgvValues.Rows) 
{ 
    row.HeaderCell.Value = (row.Index+1).ToString(); 
} 

、それが私のために働きました。 Linqではさらに簡単な回避策があるはずです。

4

row.HeaderCell.Value = ("Row " + rowNumber).ToString(); 
+0

@Andro Selva:このロジックがCTORにリンクされている場合、フォームのレンダリング時にHeaderCellの値が表示されません。 Form_Load()でこのメソッドを呼び出すと、これは機能します。 :) –

1

以下に示すようちょうど私がカールの答えを使用しますが、行が作成されると、行ヘッダ名が変更されていないと仮定すると、RowsAddedにイベントハンドラを変更toString()を呼び出します。 CellFormattingの問題点は、すべての列に対して呼び出されるため、HeaderCell.Valueを何度も繰り返し設定する時間が無駄になります。

private void dataGridViewVersions_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) 
    { 
     DataGridView gridView = sender as DataGridView; 
     MyData vr = gridView.Rows[e.RowIndex].DataBoundItem as MyData ; 
     if (vr != null) 
     { 
      gridView.Rows[e.RowIndex].HeaderCell.Value = vr.RowName.ToString(); 
     } 
    } 
関連する問題