新しいDataGridColumnStyle
を作成し、そのPaint
メソッドをオーバーライドし、カスタムペイントロジックを適用してセルのペイントをカスタマイズできます。 DataGridTextBoxColumn
から派生し、Paint
というオーバーロードを無効にすることができます。
rowNum
には、ペイントしている行番号を含むパラメータを使用できます。また、source
パラメータを使用してセルの値を抽出することで、セルのレンダリング方法を決めることができます。
public class MyDataGridTextBoxColumn : DataGridTextBoxColumn
{
protected override void Paint(Graphics g, Rectangle bounds, CurrencyManager source,
int rowNum, Brush backBrush, Brush foreBrush, bool alignToRight)
{
if (rowNum == 1) /*Specific row index*/
{
var value = this.PropertyDescriptor.GetValue(source.List[rowNum]);
var text = string.Format("{0}", value);
Rectangle rect = bounds;
using (var format = new StringFormat())
{
if (alignToRight)
format.FormatFlags |= StringFormatFlags.DirectionRightToLeft;
format.Alignment = (this.Alignment == HorizontalAlignment.Left) ?
StringAlignment.Near :
((this.Alignment == HorizontalAlignment.Center) ?
StringAlignment.Center : StringAlignment.Far);
format.FormatFlags |= StringFormatFlags.NoWrap;
g.FillRectangle(backBrush, rect);
rect.Offset(0, 2);
rect.Height -= 2;
var font = new Font(this.DataGridTableStyle.DataGrid.Font, FontStyle.Bold);
g.DrawString(text, font, foreBrush, rect, format);
}
}
else
base.Paint(g, bounds, source, rowNum, backBrush, foreBrush, alignToRight);
}
}
そして、ここでの使用されています
var dt = new DataTable();
dt.Columns.Add("A");
dt.Columns.Add("B");
dt.Rows.Add("1", "11");
dt.Rows.Add("2", "22");
dt.Rows.Add("3", "33");
var dg = new DataGrid();
dg.Dock = DockStyle.Fill;
var ts = new DataGridTableStyle();
ts.GridColumnStyles.Add(new MyDataGridTextBoxColumn()
{ MappingName = "A", HeaderText = "A" });
ts.GridColumnStyles.Add(new MyDataGridTextBoxColumn()
{ MappingName = "B", HeaderText = "B" });
dg.TableStyles.Add(ts);
this.Controls.Add(dg);
dg.DataSource = dt;
dg.BringToFront();
は多分、細胞の全体の絵を自分で行うためのオプションがありますか?または、細胞に別のコントロールを入れることはできますか? –
@GeorgBisselingはい、あります。カスタムの 'DataGridColumnStyle'を作成します。 –