孵化 DataGridView 单元格
Hatching DataGridView Cell
我在 C# 中有一个 WinForms 项目,它有 DataGridView 控件。
我正在寻找一些东西来表达 DataGridView 单元格不会被重视。
在 excel 中,应用孵化是实现此目的的好方法。所以我想孵化 DataGridView 单元格,类似于 excel 单元格,如下图所示。
我想我应该使用 CellPainting 事件。但我无法做到这一点。如果有人做过类似的事情?谢谢
你可以应付 CellPainting event and then fill the cell using a HatchBrush。还需要在滚动时使控件失效,并开启双缓冲防止闪烁。
这是一个例子:
private void Form1_Load(object sender, EventArgs e)
{
var dt = new DataTable();
dt.Columns.Add("C1");
dt.Columns.Add("C2");
dt.Columns.Add("C3");
dt.Rows.Add("X", "X", "O");
dt.Rows.Add("X", DBNull.Value, DBNull.Value);
dt.Rows.Add(DBNull.Value, DBNull.Value, DBNull.Value);
dataGridView1.DataSource = dt;
dataGridView1.CellPainting += DataGridView1_CellPainting;
dataGridView1.Scroll += (_, __) => dataGridView1.Invalidate();
dataGridView1.GetType().GetProperty("DoubleBuffered",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance).SetValue(dataGridView1, true);
}
private void DataGridView1_CellPainting(object sender,
DataGridViewCellPaintingEventArgs e)
{
if (e.ColumnIndex < 0 || e.RowIndex < 0)
return;
if(e.Value==DBNull.Value)
{
using(var b= new HatchBrush(HatchStyle.ForwardDiagonal,
Color.Black, Color.White))
{
e.Graphics.FillRectangle(b, e.CellBounds);
e.Paint(e.ClipBounds, DataGridViewPaintParts.All &
~DataGridViewPaintParts.Background);
e.Handled = true;
}
}
}
以上示例使用 ForwardDiagonal
作为 HatchStyle。
在上面的示例中,我填充了具有 DBNull.Value
作为其值的单元格的背景。您可以使用任何其他条件,例如基于将单元格设置为只读。
结果截图如下:
我在 C# 中有一个 WinForms 项目,它有 DataGridView 控件。
我正在寻找一些东西来表达 DataGridView 单元格不会被重视。
在 excel 中,应用孵化是实现此目的的好方法。所以我想孵化 DataGridView 单元格,类似于 excel 单元格,如下图所示。
我想我应该使用 CellPainting 事件。但我无法做到这一点。如果有人做过类似的事情?谢谢
你可以应付 CellPainting event and then fill the cell using a HatchBrush。还需要在滚动时使控件失效,并开启双缓冲防止闪烁。
这是一个例子:
private void Form1_Load(object sender, EventArgs e)
{
var dt = new DataTable();
dt.Columns.Add("C1");
dt.Columns.Add("C2");
dt.Columns.Add("C3");
dt.Rows.Add("X", "X", "O");
dt.Rows.Add("X", DBNull.Value, DBNull.Value);
dt.Rows.Add(DBNull.Value, DBNull.Value, DBNull.Value);
dataGridView1.DataSource = dt;
dataGridView1.CellPainting += DataGridView1_CellPainting;
dataGridView1.Scroll += (_, __) => dataGridView1.Invalidate();
dataGridView1.GetType().GetProperty("DoubleBuffered",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance).SetValue(dataGridView1, true);
}
private void DataGridView1_CellPainting(object sender,
DataGridViewCellPaintingEventArgs e)
{
if (e.ColumnIndex < 0 || e.RowIndex < 0)
return;
if(e.Value==DBNull.Value)
{
using(var b= new HatchBrush(HatchStyle.ForwardDiagonal,
Color.Black, Color.White))
{
e.Graphics.FillRectangle(b, e.CellBounds);
e.Paint(e.ClipBounds, DataGridViewPaintParts.All &
~DataGridViewPaintParts.Background);
e.Handled = true;
}
}
}
以上示例使用 ForwardDiagonal
作为 HatchStyle。
在上面的示例中,我填充了具有 DBNull.Value
作为其值的单元格的背景。您可以使用任何其他条件,例如基于将单元格设置为只读。
结果截图如下: