在datagridview单元格中绘制红线

时间:2015-04-24 18:36:47

标签: c# datagridview

如何在细胞中添加红线?

    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;
    }

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题:

  • 你创造的所有积分真的毫无意义。要绘制一条线,你只需要两个点,对于一系列n行,你需要一系列n + 1个点。

  • 不要为CellPainting添加越来越多的处理程序! dataGridView_Paint的每次通话都会增加一次。所有这一切都应该删除。在设计器中添加处理程序!

  • CellPainting事件有一些规则要遵循:

    • 如果您处理绘图,则需要处理所有,包括绘制背景和内容
    • 为了让您的生活(很多)变得更轻松,现在可以在param 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,否则请将其删除!