更改System.Windows.Forms.DataGrid中特定行的字体

时间:2016-09-27 07:26:00

标签: c# winforms datagrid

由于各种原因,我使用的是过时的System.Windows.Forms.DataGrid而不是DataGridView,我需要将特定行加粗,而其他行保持不受约束。

行标题文本和单元格都应该是粗体。我假设这是通过某种方式更改字体来完成的。我找到的唯一属性是Font和HeaderFont,但它们更改了整个控件的字体。

1 个答案:

答案 0 :(得分: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();