如何在细胞中添加红线?
private void dataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
var dg = (DataGridView)sender;
if (e.ColumnIndex == -5 || e.RowIndex != (dg.RowCount -1))
return;
using (var p = new Pen(Color.Red, 1))
{
var cellBounds = e.CellBounds;
const int size = 2;
var pts = new List<Point>();
var h = false;
for (int i = cellBounds.Left; i <= cellBounds.Right; i += size, h = !h)
{
pts.Add(
new Point
{
X = i,
Y = h ? cellBounds.Bottom : cellBounds.Bottom + size
});
}
e.Graphics.DrawLines(p, pts.ToArray());
}
}
private void dataGridView_Paint(object sender, PaintEventArgs e)
{
dataGridView.CellPainting += dataGridView_CellPainting;
}
答案 0 :(得分:0)
您的代码存在一些问题:
你创造的所有积分真的毫无意义。要绘制一条线,你只需要两个点,对于一系列n行,你需要一系列n + 1个点。
不要为CellPainting
添加越来越多的处理程序! dataGridView_Paint
的每次通话都会增加一次。所有这一切都应该删除。在设计器中添加处理程序!
CellPainting
事件有一些规则要遵循:
e
e.Handled = true;
以下是在每个单元格下绘制红线的代码,包括RowHeader
:
private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
var dg = (DataGridView)sender; // a short reference
if (e.ColumnIndex == -5 || e.RowIndex != (dg.RowCount - 1))
return;
using (var p = new Pen(Color.Red, 1))
{
var cb = e.CellBounds; // a short reference
e.PaintBackground(e.ClipBounds, true);
e.PaintContent(e.ClipBounds);
e.Graphics.DrawLine(p, cb.X, cb.Y + cb.Height, cb.X + cb.Width, cb.Y + cb.Height);
e.Handled = true;
}
}
我把它留了下来,但我想知道e.ColumnIndex == -5
的意图是什么;也许是一个错字?要排除RowHeader
将其更改为e.ColumnIndex < 0
,否则请将其删除!