auto9817 Ответов: 2

Рисование линии между двумя ячейками в datagridview - csharp


Привет.

Я искал весь сайт, но не смог найти никаких полезных советов по этому поводу. Моя просьба состоит в том, чтобы провести линию между двумя ячейками в DataGridView.

Я попытался использовать событие CellPaint, но, похоже, событие CellPaint работает только для рисования внутри одной ячейки, как рисование границы ячейки.

Если я хочу, чтобы нарисовать линию по диагонали от клетки с строку 0 и столбец 0 и ячейка B с строка 10, столбец 10 в то же практическое руководство, как можно этого добиться ? Я хочу соединить среднюю точку ячейки а со средней точкой ячейки В с помощью линии.

Пожалуйста, поделитесь своим ценным советом.

Заранее спасибо.

Что я уже пробовал:

    int rIndexPrev = lineCellRow[i - 1];
    int cIndexPrev = lineCellColumn[i - 1];

    int rIndexNext = lineCellRow[i];
    int cIndexNext = lineCellColumn[i];



    if (rIndexPrev >= 0 && rIndexNext >= 0)
    {

        try
        {
            DataGridViewCell cellPrev = dataGridView1[rIndexPrev, cIndexPrev];
            DataGridViewCell cellNext = dataGridView1[rIndexNext, cIndexNext];

            int x1 = (cellPrev.ContentBounds.Left + cellPrev.ContentBounds.Right) / 2;
            int y1 = (cellPrev.ContentBounds.Bottom + cellPrev.ContentBounds.Top) / 2;

            int x2 = (cellNext.ContentBounds.Left + cellNext.ContentBounds.Right) / 2;
            int y2 = (cellNext.ContentBounds.Bottom + cellNext.ContentBounds.Top) / 2;



            e.Graphics.DrawLine(linePen, x1, y1, x2, y2);
        }
        catch (Exception ex)
        {

        }
    }

}

2 Ответов

Рейтинг:
1

OriginalGriff

Вы не можете (или, по крайней мере, не должны) делать это в методе рисования ячеек - это широкая функция DGV, поэтому она принадлежит событию DGV Paint.
Там все довольно просто:

private void myDataGridView_Paint(object sender, PaintEventArgs e)
    {
    if (myDataGridView.Rows.Count >= 3 && myDataGridView.Columns.Count >= 3)
        {
        Rectangle TL = myDataGridView.GetCellDisplayRectangle(0, 0, false);
        Rectangle BR = myDataGridView.GetCellDisplayRectangle(2, 2, false);

        int x1 = (TL.Left + TL.Right) / 2;
        int y1 = (TL.Bottom + TL.Top) / 2;

        int x2 = (BR.Left + BR.Right) / 2;
        int y2 = (BR.Bottom + BR.Top) / 2;

        e.Graphics.DrawLine(Pens.Red, x1, y1, x2, y2);
        }
    }


auto9817

Я попробовал этот код, потому что он прост. Код может хорошо работать. Но есть потенциальная проблема. Когда ячейки не видны в форме, это может привести все к 0, 0, потому что метод GetCellDisplayRectanlge ничего не возвращает, когда ячейка не видна. Например, проблемы могут остаться со свитком или т. д.

Рейтинг:
1

RickZeeland

Однажды я использовал прозрачную панель, чтобы поместить ее поверх другого элемента управления, может быть, вы можете использовать ее, чтобы нарисовать свою диагональную линию. Текст в статье не будет иметь к вам отношения, просто скачайте приложение CustomGroupBox2 код: Новый скин для Ye Olde GroupBox[^]

Вы могли бы изменить TransparentPanel код вроде этого:

using System.Drawing;
using System.Windows.Forms;

public class PanelTransparent : Control
{
    /// <summary>
    /// Transparent Panel.
    /// </summary>
    public PanelTransparent()
    {
        SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        SetStyle(ControlStyles.UserPaint, true);
        SetStyle(ControlStyles.Opaque, true);
        this.BackColor = Color.Transparent;
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle = cp.ExStyle | 0x20;
            return cp;
        }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        Pen linePen = new Pen(Color.Black);
        e.Graphics.DrawLine(linePen, 0, 0, Width, Height);
    }
}