Cellule d’en-tête de ligne d’affichage DataGridView

J’essaie d’afficher un simple DataGridView lié à un DataTable et je souhaite, en définitive, que ma première colonne du DataTable soit la cellule d’en-tête de ligne du DataGridView. À ce stade, je me contenterai d’avoir une valeur quelconque dans la cellule d’en-tête de ligne. Je peux afficher le DataGridView avec toutes mes lignes et colonnes et avec les cellules d’en-tête de colonne, mais pas de cellule d’en-tête de ligne. Je vérifie la valeur dans la ligne.HeaderCell.Value, et les données que je mets là sont là. Je vérifie row.HeaderCell.Displayed et c’est false, mais c’est en lecture seule, je ne peux donc pas le rendre vrai. Comment afficher la cellule d’en-tête de ligne?

Voici un exemple simple de ce que j’ai essayé de faire fonctionner ceci:

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

Si vous placez ce code dans le constructeur, cela ne fonctionnera pas. Déplacez le code dans l’événement Load du formulaire et cela devrait fonctionner correctement. Un problème courant avec Windows.Forms et C # est l’utilisation d’une initialisation incorrecte dans le constructeur. De nombreux contrôles ne sont entièrement créés que lorsque le constructeur a terminé. (J’oublie pourquoi, mais je pense que c’est parce que le descripteur n’est pas encore créé.) De nombreux “contournements” peuvent être évités si vous initialisez l’événement Load comme recommandé par Microsoft.

Il suffit d’appeler ToSsortingng () comme indiqué ci-dessous

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

La réponse semble gérer l’événement DataGridView.CellFormatting. Pourquoi définir la valeur ailleurs ne fonctionne pas me dépasse, mais je suis sûr qu’il y a une raison. J’ai ajouté le gestionnaire d’événements suivant et tout va bien:

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

Après avoir affecté des valeurs à la datagridview, soit par liaison, soit manuellement, j’ai procédé comme suit:

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

et cela a fonctionné pour moi. Je pense qu’il devrait y avoir une solution de contournement encore plus simple dans Linq.

J’ai utilisé la réponse de Karl, mais j’ai changé le gestionnaire d’événements en RowsAdded, en supposant que le nom de l’en-tête de la ligne ne change pas une fois la ligne créée. Le problème avec CellFormatting est qu’il est appelé pour chaque colonne, il perd donc un peu de temps à définir encore et encore 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.ToSsortingng(); } }