C#では、DataGridViewのRowHeaderに文字列を追加できますか?もしそうなら、どのように達成されますか?
これまでの年間の顧客支払いデータを表示するWindowsフォームを作成しています。
ColumnHeadersは、1月、2月、3月などを表示し、DateTime.Now.Yearの空の列ではなく、RowHeaderに配置して実際の支払いデータから目立たせます。
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();
}
}
DataGridViewの行ヘッダーに行番号を表示 も参照してください。
datagridview1.Rows[0].HeaderCell.Value = "Your text";
できます。
RowValidatedイベントを使用する必要はありません。これは、これが機能することを確認するために小さなテストアプリで使用したイベントですが、行(列ではなく)ヘッダーテキストを指定した年に設定します。
実際には、おそらくCellFormattingイベントの方がうまくいくでしょう。
private void dataGridView_RowValidated(object sender, DataGridViewCellEventArgs e)
{
DataGridView gridView = sender as DataGridView;
if (null != gridView)
{
gridView.Rows[e.RowIndex].HeaderCell.Value = "2009";
}
}
[〜#〜] edit [〜#〜]:ここに、私が使用したTestForm全体を、ソリューションを示すために可能な限り簡単に示します。 RowHeadersWidthがテキストを表示するのに十分な幅であることを確認してください。
#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
}
}
これは、最初の列(行ヘッダー列)の幅のためです!幅を大きくすると、値がわかります!次のコマンドを使用できます。
dgv1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
(注意:最初にdgv1.RowHeadersVisible = true;
を設定する必要があります)
私は同じ問題を抱えていましたが、datagrid.visible
プロパティが変更された後、データグリッドが行のヘッダーを失ったことに気付きました。
Datagrid.visiblechanged
イベントで行のヘッダーを更新してください。
同じ問題がありました。データバインドグリッドで行ヘッダーデータ(単純な行番号)を表示するヘッダー列を取得できませんでした。コードをイベント「DataBindingComplete」に移動すると、機能しました。
余分なコードでごめんなさい。実用的な例を提供したかったのですが、すべてを削減する時間はないので、アプリの一部を切り取って貼り付け、実行できるように修正しました。どうぞ:
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();
}
}
}
はい、できます
DataGridView1.Rows[0].HeaderCell.Value = "my text";
foreach (DataGridViewRow row in datagrid.Rows)
row.HeaderCell.Value = String.Format("{0}", row.Index + 1);
私はそれがあるべきだと思う:
dataGridView1.Columns[0].HeaderCell.Value = "my text";
ここに小さな「クーデター」があります
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