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

C# 更改System.Windows.Forms.DataGrid中特定行的字体,c#,winforms,datagrid,C#,Winforms,Datagrid,出于各种原因,我使用的是过时的System.Windows.Forms.DataGrid而不是DataGridView,我需要将某一行加粗,而其他行保持未绑定状态 行标题文本和单元格均应为粗体。我想这是通过改变字体来实现的。我找到的唯一属性是Font和HeaderFont,但它们会更改整个控件的字体。您可以创建一个新的并覆盖其绘制方法,并应用自定义绘制逻辑来自定义单元格的绘制。您可以派生并重写的此重载 可以使用rowNum参数,该参数包含正在绘制的行号。此外,您还可以使用source参数提取单元

出于各种原因,我使用的是过时的System.Windows.Forms.DataGrid而不是DataGridView,我需要将某一行加粗,而其他行保持未绑定状态

行标题文本和单元格均应为粗体。我想这是通过改变字体来实现的。我找到的唯一属性是Font和HeaderFont,但它们会更改整个控件的字体。

您可以创建一个新的并覆盖其
绘制方法,并应用自定义绘制逻辑来自定义单元格的绘制。您可以派生并重写的此重载

可以使用
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
。顺便说一下,您肯定已经考虑过了,但我也建议您集中精力将
DataGrid
替换为
DataGridView
。我使用的是从DataGrid继承的自定义控件。替换它会很困难。当然您更了解需求和情况,但我想您可以实现/或者在
DataGridView
中使用自定义控件功能。