自定义DataGridView底线问题

时间:2011-09-15 17:11:28

标签: c# winforms forms custom-controls

我遇到了自定义DataGridView的问题。我想绘制一个底线,但是当我滚动网格时,我无法避免绘制留在单元格上的这条线。

enter image description here

public partial class GridTest : DataGridView
{

    private static Color _gridColor = Color.FromArgb(219, 225, 232);


    private int gridHeight;
    private bool resizing;

    private const int Xoffset = 5;
    private const int Yoffset = 10;

    Color cl1 = Color.FromArgb(255, 255, 255);
    Color cl2 = Color.FromArgb(229, 233, 238);

    Color cl3 = Color.FromArgb(234, 237, 242);
    Color cl4 = Color.FromArgb(170, 186, 208);

    private Color _clrColumnHeader;
    public Color ColorColumnHeader
    {
        get { return _clrColumnHeader; }
        set { _clrColumnHeader = value; }
    }

    public GridTest()
    {
        InitializeComponent();
        Init();
     }

    public GridTest(IContainer container)
    {
        container.Add(this);
        InitializeComponent();
        Init();
    }

    private void Init()
    {
        var _headerHeight = 50;
        ColumnHeadersHeight = _headerHeight;
        BackgroundColor = Color.White;
        RowTemplate.Height += 5;

        AllowUserToAddRows = false;
        AllowUserToDeleteRows = false;
        AllowUserToResizeColumns = false;
        AllowUserToResizeRows = false;

        AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders);
        AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
        CellBorderStyle = DataGridViewCellBorderStyle.SingleHorizontal;

        RowHeadersVisible = false;
        MultiSelect = false;
        ReadOnly = true;
        AutoGenerateColumns = false;
        EnableHeadersVisualStyles = false;
        ShowCellErrors = false;
        ShowEditingIcon = false;
        ShowRowErrors = false;
    }

    private Blend gradientBlend()
    {
        float[] myFactors = { 0.0f, .00f, .8f, 1.0f }; 
        float[] myPositions = { 0.0f, .4f, .8f, 1.0f };
        var myBlend = new Blend {Factors = myFactors, Positions = myPositions};
        return myBlend;
    }

    private void DrawGradientOnHeader(DataGridViewCellPaintingEventArgs e)
    {
        var newRect = new Rectangle(e.CellBounds.X+1, e.CellBounds.Y, e.CellBounds.Width -1, e.CellBounds.Height-1);
        var gradient = new LinearGradientBrush(newRect, cl1, cl2, LinearGradientMode.Vertical);
        gradient.Blend = gradientBlend();
        e.Graphics.FillRectangle(gradient, newRect);
        gradient.Dispose();
    }

    private static void DrawWhiteLine(DataGridViewCellPaintingEventArgs e, int x, int offset)
    {
        var brush = new SolidBrush(Color.White);
        var pen = new Pen(brush);

        int y = e.CellBounds.Y;
        int x1 = x + offset;
        int y1 = e.CellBounds.Height - 1;

        var pt1 = new Point(x1, y);
        var pt2 = new Point(x1, y1);
        e.Graphics.DrawLine(pen, pt1, pt2); 
        brush.Dispose();
        pen.Dispose();
    }

    private void DrawSeparators(DataGridViewCellPaintingEventArgs e)
    {
        DrawWhiteLine(e,e.CellBounds.Right,-1);
        DrawWhiteLine(e, e.CellBounds.Left,1);

        int x = e.CellBounds.X;
        int y = e.CellBounds.Y;
        int y1 = e.CellBounds.Height - 1;

        var newRect2 = new Rectangle(x, y, 1, y1);
        var gradient = new LinearGradientBrush(newRect2, cl3, cl4, LinearGradientMode.Vertical);
        gradient.Blend = gradientBlend();
        e.Graphics.FillRectangle(gradient, newRect2);
        gradient.Dispose();
    }

    private static void DrawLines(DataGridViewCellPaintingEventArgs e)
    {
        var brush= new SolidBrush(Color.FromArgb(170, 186, 208));
        var pen = new Pen(brush);
        //Верхняя линяя над хидером
        e.Graphics.DrawLine(pen, e.CellBounds.X, e.CellBounds.Top , e.CellBounds.Right, e.CellBounds.Top );
        //Нижняя линия под хидером
        e.Graphics.DrawLine(pen, e.CellBounds.X, e.CellBounds.Bottom - 1, e.CellBounds.Right, e.CellBounds.Bottom-1);
        brush.Dispose();
        pen.Dispose();
    }

    private void DrawText(DataGridViewCellPaintingEventArgs e)
    {
        var clr_font = _clrColumnHeader;
        var rect = new Rectangle(e.CellBounds.X + Xoffset, e.CellBounds.Y + Yoffset, e.CellBounds.Width,
                                       e.CellBounds.Height);
        var formatFlags = TextFormatFlags.WordBreak;

        if (e.Value != null)
        {
            try
            {
                TextRenderer.DrawText(e.Graphics, (String)e.Value, e.CellStyle.Font, rect, clr_font, formatFlags);
            }
            catch
            {
                TextRenderer.DrawText(e.Graphics, "", e.CellStyle.Font, rect, clr_font, formatFlags);
            }
        }
    }

    private void EraseTheCell(DataGridViewCellPaintingEventArgs e)
    {
        using (Brush backColorBrush = new SolidBrush(e.CellStyle.BackColor))
        {
            e.Graphics.FillRectangle(backColorBrush, e.CellBounds);
        }
    }

    protected override void OnColumnWidthChanged(DataGridViewColumnEventArgs e)
    {
        base.OnColumnWidthChanged(e);
        Invalidate();
    }

    private int oldRowIndex = 0;
    protected override void OnCurrentCellChanged(EventArgs e)
    {
        base.OnCurrentCellChanged(e);

        if (oldRowIndex != -1)
        {
            InvalidateRow(oldRowIndex);
        }
        oldRowIndex = CurrentCellAddress.Y;
    }

    protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e)
    {
        base.OnCellPainting(e);
        if (e.RowIndex == -1)  // Рисуем ColumnHeader 
        {
            EraseTheCell(e);
            DrawGradientOnHeader(e);
            DrawSeparators(e);
            DrawText(e);
            DrawLines(e);
            e.Handled = true;
        }
        //e.CellStyle.BackColor = Color.White;
    }

    protected override void PaintBackground(Graphics graphics, Rectangle clipBounds, Rectangle gridBounds)
    {
        base.PaintBackground(graphics, clipBounds, gridBounds);
        var brush = new SolidBrush(Color.Black);
        var pen = new Pen(brush);

        var y_crd = clipBounds.Bottom - 10; 
        var x_crd = clipBounds.Right;

        graphics.FillRectangle(brush, clipBounds);

        var newbounds = new Rectangle
                            {
                                X = clipBounds.X,
                                Y = clipBounds.Y,
                                Width = clipBounds.Width,
                                Height = clipBounds.Height - 1
                            };

        var brushWhite = new SolidBrush(Color.White);
        graphics.FillRectangle(brushWhite, newbounds);
        //graphics.DrawLine(pen, 0, y_crd, x_crd, y_crd);

        brush.Dispose();
        pen.Dispose();
    }

}      

0 个答案:

没有答案