2016-09-27 14 views
2

さまざまな理由から、私はDataGridViewの代わりに廃止されたSystem.Windows.Forms.DataGridを使用しており、特定の行を太字にする必要がありますアンボールドされたままである。System.Windows.Forms.DataGridの特定の行のフォントを変更する

行のヘッダーテキストとセルの両方を太字にする必要があります。私はこれが何とかフォントを変更することによって行われると仮定します。私が見つけた唯一のプロパティはFontとHeaderFontでしたが、コントロール全体のフォントを変更しました。

+0

は多分、細胞の全体の絵を自分で行うためのオプションがありますか?または、細胞に別のコントロールを入れることはできますか? –

+0

@GeorgBisselingはい、あります。カスタムの 'DataGridColumnStyle'を作成します。 –

答えて

1

新しい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(); 
+0

ところで、確かにそれについて考えましたが、 'DataGrid'を' DataGridView'に置き換える努力に集中することをお勧めします。 –

+0

私はDataGridから継承したカスタムコントロールを使用しています。それを置き換えることは難しいでしょう。 – sashoalm

+0

あなたは要件と状況をよく知っていますが、私はあなたが/ DataGridViewでカスタム制御機能を実装できると思います。 –

関連する問題