C # vous permet-il d'ajouter 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 client 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, je voudrais le placer dans le RowHeader pour le faire ressortir 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'avez pas besoin d'utiliser l'événement RowValidated, c'est juste celui que j'ai utilisé pour une petite application de test pour vous assurer que cela fonctionne, mais cela définira le texte d'en-tête de ligne (et non de colonne) sur l'année que vous spécifiez.
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'intégralité du TestForm que j'ai utilisé, aussi simple que possible pour démontrer 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
{
/// <summary>
/// Required designer variable.
/// </summary>
private IContainer components;
private DataGridView dataGridView1;
private DataGridViewTextBoxColumn Month;
public GridTest()
{
InitializeComponent();
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
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
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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 ligne)! 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 grille de données a perdu l'en-tête des lignes après le datagrid.visible
propriété modifiée.
Essayez de mettre à jour les en-têtes des lignes avec le Datagrid.visiblechanged
un événement.
J'ai eu le même problème. Impossible d'obtenir la colonne d'en-tête pour afficher les données d'en-tête de ligne (un simple numéro de ligne) avec ma grille 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 fournir un exemple de travail, mais je n'ai pas le temps de tout couper, alors coupez et collez une partie de mon application et corrigez-la pour qu'elle fonctionne pour vous. 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<DataPoint> pts = new List<DataPoint>();
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();
}
}
}
oui, vous pouvez
DataGridView1.Rows[0].HeaderCell.Value = "my text";
foreach (DataGridViewRow row in datagrid.Rows)
row.HeaderCell.Value = String.Format("{0}", row.Index + 1);
Je pense que ça devrait être:
dataGridView1.Columns[0].HeaderCell.Value = "my text";
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 String, 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