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