Ajout de texte à l’en-tête de ligne DataGridView

C # vous permet-il d’append une chaîne à un RowHeader dans un DataGridView? Si oui, comment est-il accompli?

J’écris un formulaire Windows pour afficher les données de paiement des clients pour l’année jusqu’à présent.

Les ColumnHeaders affichent janvier, février, mars, etc., et plutôt que d’avoir une colonne vide avec DateTime.Now.Year, j’aimerais le mettre dans RowHeader pour le différencier des données de paiement réelles.

private void dtgworkingdays_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) { this.FillRecordNo(); } private void FillRecordNo() { for (int i = 0; i < this.dtworkingdays.Rows.Count; i++) { this.dtgworkingdays.Rows[i].HeaderCell.Value = (i + 1).ToString(); } } 

Voir aussi Afficher le numéro de ligne dans l'en-tête de ligne d'un DataGridView .

 datagridview1.Rows[0].HeaderCell.Value = "Your text"; 

Ça marche.

Vous n’êtes pas obligé d’utiliser l’événement RowValidated, c’est celui que j’ai utilisé pour une petite application de test pour vous assurer que cela fonctionnait, mais le texte de l’en-tête de ligne (et non de colonne) sera défini sur l’année spécifiée.

Cela irait probablement mieux dans l’événement CellFormatting, en fait.

  private void dataGridView_RowValidated(object sender, DataGridViewCellEventArgs e) { DataGridView gridView = sender as DataGridView; if (null != gridView) { gridView.Rows[e.RowIndex].HeaderCell.Value = "2009"; } } 

EDIT : Voici l’ensemble du TestForm que j’ai utilisé, aussi simple que possible pour illustrer la solution. Assurez-vous que votre RowHeadersWidth est suffisamment large pour afficher le texte.

 #region using System.ComponentModel; using System.Windows.Forms; #endregion namespace DataGridViewTest { public class GridTest : Form { ///  /// Required designer variable. ///  private IContainer components; private DataGridView dataGridView1; private DataGridViewTextBoxColumn Month; public GridTest() { InitializeComponent(); } ///  /// Clean up any resources being used. ///  /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } private void dataGridView_RowValidated(object sender, DataGridViewCellEventArgs e) { DataGridView gridView = sender as DataGridView; if (null != gridView) { gridView.Rows[e.RowIndex].HeaderCell.Value = "2009"; } } #region Windows Form Designer generated code ///  /// Required method for Designer support - do not modify /// the contents of this method with the code editor. ///  private void InitializeComponent() { this.dataGridView1 = new System.Windows.Forms.DataGridView(); this.Month = new System.Windows.Forms.DataGridViewTextBoxColumn(); ((System.ComponentModel.ISupportInitialize) (this.dataGridView1)).BeginInit(); this.SuspendLayout(); // // dataGridView1 // this.dataGridView1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.Month }); this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill; this.dataGridView1.Location = new System.Drawing.Point(0, 0); this.dataGridView1.Name = "dataGridView1"; this.dataGridView1.RowHeadersWidth = 100; this.dataGridView1.Size = new System.Drawing.Size(745, 532); this.dataGridView1.TabIndex = 0; this.dataGridView1.RowValidated += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView_RowValidated); // // Month // this.Month.HeaderText = "Month"; this.Month.Name = "Month"; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(745, 532); this.Controls.Add(this.dataGridView1); this.Name = "Form1"; this.Text = "Form1"; ((System.ComponentModel.ISupportInitialize) (this.dataGridView1)).EndInit(); this.ResumeLayout(false); } #endregion } } 

c’est à cause de la largeur de votre première colonne (colonne d’en-tête de lignes)! augmentez sa largeur alors vous pouvez voir sa valeur! vous pouvez utiliser cette commande:

 dgv1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders; 

(remarque: vous devez d’abord définir dgv1.RowHeadersVisible = true; )

J’ai eu le même problème, mais j’ai remarqué que ma grid de données avait perdu l’en-tête des lignes après la modification de la propriété datagrid.visible .

Essayez de mettre à jour les en-têtes des lignes avec l’événement Datagrid.visiblechanged .

Oui, vous pouvez

 DataGridView1.Rows[0].HeaderCell.Value = "my text"; 

J’ai eu le même problème. Impossible d’obtenir que la colonne d’en-tête affiche les données d’en-tête de ligne (un simple numéro de ligne) avec ma grid liée aux données. Une fois que j’ai déplacé le code vers l’événement “DataBindingComplete”, cela a fonctionné.

Désolé pour le code supplémentaire. Je voulais donner un exemple concret, mais je n’ai pas le temps de tout réduire. Il vous suffit de copier / coller une partie de mon application et de la réparer pour qu’elle fonctionne à votre place. Voici:

 using System; using System.Collections.Generic; using System.Data; using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; namespace WindowsFormsApplication3 { public partial class Form1 : Form { private List pts = new List(); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { InsertPoint(10, 20); InsertPoint(12, 40); InsertPoint(16, 60); InsertPoint(20, 77); InsertPoint(92, 80); MakeGrid(); } public void InsertPoint(int parameterValue, int commandValue) { DataPoint pt = new DataPoint(); pt.XValue = commandValue; pt.YValues[0] = parameterValue; pts.Add(pt); } private void MakeGrid() { dgv1.SuspendLayout(); DataTable dt = new DataTable(); dt.Columns.Clear(); dt.Columns.Add("Parameter"); dt.Columns.Add("Command"); //*** Add Data to DataTable for (int i = 0; i <= pts.Count - 1; i++) { dt.Rows.Add(pts[i].XValue, pts[i].YValues[0]); } dgv1.DataSource = dt; //*** Formatting for the grid is performed in event dgv1_DataBindingComplete. //*** If its performed here, the changes appear to get wiped in the grid control. } private void dgv1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) { DataGridViewCellStyle style = new DataGridViewCellStyle(); style.Alignment = DataGridViewContentAlignment.MiddleRight; //*** Add row number to each row foreach (DataGridViewRow row in dgv1.Rows) { row.HeaderCell.Value = (row.Index + 1).ToString(); row.HeaderCell.Style = style; row.Resizable = DataGridViewTriState.False; } dgv1.ClearSelection(); dgv1.CurrentCell = null; dgv1.ResumeLayout(); } } } 

Je pense que cela devrait être:

 dataGridView1.Columns[0].HeaderCell.Value = "my text"; 
 foreach (DataGridViewRow row in datagrid.Rows) row.HeaderCell.Value = Ssortingng.Format("{0}", row.Index + 1); 

Voici un petit coup de pouce

 Public Class DataGridViewRHEx Inherits DataGridView Protected Overrides Function CreateRowsInstance() As System.Windows.Forms.DataGridViewRowCollection Dim dgvRowCollec As DataGridViewRowCollection = MyBase.CreateRowsInstance() AddHandler dgvRowCollec.CollectionChanged, AddressOf dvgRCChanged Return dgvRowCollec End Function Private Sub dvgRCChanged(sender As Object, e As System.ComponentModel.CollectionChangeEventArgs) If e.Action = System.ComponentModel.CollectionChangeAction.Add Then Dim dgvRow As DataGridViewRow = e.Element dgvRow.DefaultHeaderCellType = GetType(DataGridViewRowHeaderCellEx) End If End Sub End Class 

 Public Class DataGridViewRowHeaderCellEx Inherits DataGridViewRowHeaderCell Protected Overrides Sub Paint(graphics As System.Drawing.Graphics, clipBounds As System.Drawing.Rectangle, cellBounds As System.Drawing.Rectangle, rowIndex As Integer, dataGridViewElementState As System.Windows.Forms.DataGridViewElementStates, value As Object, formattedValue As Object, errorText As Ssortingng, cellStyle As System.Windows.Forms.DataGridViewCellStyle, advancedBorderStyle As System.Windows.Forms.DataGridViewAdvancedBorderStyle, paintParts As System.Windows.Forms.DataGridViewPaintParts) If Not Me.OwningRow.DataBoundItem Is Nothing Then If TypeOf Me.OwningRow.DataBoundItem Is DataRowView Then End If End If 'HERE YOU CAN USE DATAGRIDROW TAG TO PAINT STRING formattedValue = CStr(Me.DataGridView.Rows(rowIndex).Tag) MyBase.Paint(graphics, clipBounds, cellBounds, rowIndex, dataGridViewElementState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts) End Sub End Class 

Oui. Commencez par accrocher l’événement ajouté à la colonne:

 this.dataGridView1.ColumnAdded += new DataGridViewColumnEventHandler(dataGridView1_ColumnAdded); 

Ensuite, dans votre gestionnaire d’événements, ajoutez simplement le texte que vous souhaitez:

 private void dataGridView1_ColumnAdded(object sender, DataGridViewColumnEventArgs e) { e.Column.HeaderText += additionalHeaderText; } 

assurez-vous que l’ Enable Column Recording est cochée.