2009-08-12 19 views
7

Sto cercando di visualizzare un DataGridView semplice collegato a un DataTable e voglio, in definitiva, la mia prima colonna in DataTable essere la cella di intestazione di riga per DataGridView. A questo punto mi accontento di avere qualsiasi valore nella cella dell'intestazione di riga. Posso visualizzare DataGridView con tutte le mie righe e colonne e con le celle di intestazione di colonna, ma nessuna cella di intestazione di riga. Controllo il valore nella riga.HeaderCell.Value e i dati che ho inserito sono lì. Controllo row.HeaderCell.Displayed ed è falso, ma questo è di sola lettura, quindi non posso renderlo vero. Come faccio a visualizzare la cella dell'intestazione di riga?DataGridView cella di intestazione riga di visualizzazione

Ecco un semplice esempio di ciò che ho cercato di arrivare a questo lavoro:

 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); 

risposta

1

La risposta sembra essere la gestione dell'evento DataGridView.CellFormatting. Perché impostare altrove il valore non funziona è al di là di me, ma sono sicuro che c'è una ragione. Ho aggiunto il seguente gestore di eventi e tutto va bene:

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

Credo che questa sia una specie di bug. In VB.NET, puoi impostare 'HeaderCell.Value' secondo necessità. Tuttavia, devi ricorrere al tuo lavoro in C#. –

+2

Questo perché il codice viene eseguito dal costruttore. Sposta il codice per caricare eventi o altri gestori di eventi. – AMissico

+0

Questo è chiamato per ogni colonna, quindi è un po 'dispendioso. Potrebbe essere necessario modificarlo in modo che controlli e.ColumnIndex == 0 prima di impostare HeaderCell.Value. –

9

Se si inserisce questo codice nel costruttore, non funzionerà. Sposta il codice nell'evento Load del modulo e dovrebbe funzionare correttamente. Un problema comune con Windows.Forms e C# è l'uso di inizializzazione impropria nel costruttore. Molti controlli non vengono creati completamente fino al termine del costruttore. (Ho dimenticato il motivo, ma credo che sia perché l'handle non è ancora stato creato.) Molti "work around" possono essere evitati, se si inizializza nell'evento Load come raccomandato da Microsoft.

1

Dopo l'assegnazione di valori al datagridview, sia vincolante o manualmente, ho fatto la seguente:

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

e ha funzionato per me. Penso che ci dovrebbe essere qualche soluzione ancora più semplice in Linq.

4

Basta chiamare ToString(), come riportato qui di seguito

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

@Andro Selva: se questa logica è collegata a CTOR, non riesco a vedere il valore HeaderCell quando il modulo viene visualizzato. Se chiamo questo metodo in Form_Load(), funziona. :) –

1

ho usato la risposta di Karl, ma cambiato il gestore di eventi per RowsAdded, assumendo il nome di intestazione di riga non cambia una volta creato il fila. Il problema con CellFormatting è che viene chiamato per ogni colonna, quindi ci vuole un po 'di tempo per impostare HeaderCell.Value più e più volte.

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(); 
     } 
    } 
Problemi correlati