[英]WinForm DataGrid Change cell color
我在 WinForm 项目中有一个 DataGrid Object
Friend WithEvents StatusTable As System.Windows.Forms.DataGrid
我还有一个 DataSet Private StatusDS As Data.DataSet
,其中的数据加载到 StatusTable 中,例如
StatusTable.DataSource = StatusDS.Tables("Channels")
一切正常,但现在我必须在第 3 列和第 x 行为“12”时更改整行背景颜色
我的第 3 列是一个字符串,名为 Act
我的专栏更新像
Dim ts As New DataGridTableStyle
Dim Act As New DataGridTextBoxColumn
Act.MappingName = "Act"
Act.Alignment = HorizontalAlignment.Center
Act.HeaderText = "Action"
ts.GridColumnStyles.Add(Act)
StatusTable.TableStyles.Add(ts)
如果列 act 和行 X 为“12”,我找不到任何方法来更改行背景颜色
例如,如果我有这张桌子
Act
"1"
"12"
"1"
"4"
"12"
我必须更改第 2 行和第 5 行的颜色(第一个从 1 开始)
我有很多代码,我试着把最小的..告诉我你是否错过了任何信息
Note: The question is about Windows Forms .NET DataGrid which is deprecated and no longer available in .NET CORE and .NET 5. It's strongly recommended to upgrade your solution to use DataGridView ;
无论如何,如果您被 DataGrid 卡住并且无法轻松更新到 DataGridView,那么答案就是给您的。
自定义 DataGrid 的外观
要自定义一个DataGrid控件,通常需要定义一个DataGridTableStyle并为其添加一些DataGridColumnStyle 。
要完全控制行和列的外观,您通常需要从现有的内置列 styles 之一(如DataGridTextBoxColumn或DataGridBoolColumn或基本DataGridColumnStyle )驱动来创建自定义列 styles。 然后,您可以通过覆盖 class 的属性和方法来自定义行为。
你会发现这篇文章非常有用:
示例 - 根据特定列的单元格值更改行背景颜色
在这里,我通过从内置DataGridTextBoxColumn派生并覆盖其Paint方法来创建新的列样式。 在该方法中,我检查第一列的值是否为奇数:
public class MyDataGridTextBoxColumn : DataGridTextBoxColumn
{
protected override void Paint(Graphics g, Rectangle bounds, CurrencyManager source,
int rowNum, Brush backBrush, Brush foreBrush, bool alignToRight)
{
var idCellValue = ((DataRowView)source.List[rowNum])["Id"];
var brush = backBrush;
if (idCellValue != DBNull.Value && ((int)idCellValue) % 2 == 1)
brush = Brushes.Yellow;
base.Paint(g, bounds, source, rowNum, brush, foreBrush, alignToRight);
}
}
然后使用它:
private void Form1_Load(object sender, EventArgs e)
{
var dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Rows.Add(1, "A");
dt.Rows.Add(2, "B");
dt.Rows.Add(3, "C");
var dg = new DataGrid();
dg.Dock = DockStyle.Fill;
var ts = new DataGridTableStyle();
ts.GridColumnStyles.Add(new MyDataGridTextBoxColumn()
{ MappingName = "Id", HeaderText = "Id" });
ts.GridColumnStyles.Add(new MyDataGridTextBoxColumn()
{ MappingName = "Name", HeaderText = "Name" });
dg.TableStyles.Add(ts);
this.Controls.Add(dg);
dg.DataSource = dt;
}
你会看到结果:
注意:不将任何业务逻辑放在自定义列中肯定更有意义,相反,您可以引发 Formatting 事件,并将任何逻辑放在事件处理程序中并将格式化数据传递回列,使用事件 arguments。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.