功能在datagridview上绘制“Dependent cells”

时间:2017-02-09 09:17:29

标签: c# winforms datagridview

我想在我的DataGridView中实现类似于MsExcel中的“Dependent cells”的功能,如下图所示。 最好的是某种绘制函数,它将目标和依赖的datagridviewcell地址作为参数,并在datagridview上绘制箭头。 知道怎么做吗?

Excel table with

1 个答案:

答案 0 :(得分:4)

您可以使用Paint事件进行绘图。

我们假设您已经收集了要在List<T>

中连接的单元格
List<Tuple<DataGridViewCell, DataGridViewCell>> DgvCells =
                             new List<Tuple<DataGridViewCell, DataGridViewCell>>();

现在您可以编写DGV的Paint事件来进行绘图,可能是这样的:

private void dataGridView1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
    foreach(var t in DgvCells)
    {
        if (!(t.Item1.Displayed && t.Item2.Displayed)) continue;
        Point p1 = GetCenter(dataGridView1.GetCellDisplayRectangle(
                                           t.Item1.ColumnIndex, t.Item1.RowIndex, true));
        Point p2 = GetCenter(dataGridView1.GetCellDisplayRectangle(
                                           t.Item2.ColumnIndex, t.Item2.RowIndex, true));
        using (Pen pen = new Pen(Color.Blue, 1) 
              { EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor })
            e.Graphics.DrawLine(pen, p1, p2);
    }
}

它使用一个小辅助函数:

Point GetCenter(Rectangle r)
{ return new Point(r.X + r.Width / 2, r.Y + r.Height / 2); }

我在CellMouseClick事件中添加了代码以添加到列表中。结果如下:

enter image description here

您可以添加代码来设置绘图样式,例如添加StartCap或使用不同的颜色等。

与往常一样,每当您添加或删除要连接的单元格列表中的元素时,您都需要在Invalidate()上调用DGV

请注意,这只是一个最小的例子。您将需要添加代码以捕获各种错误或决定在未显示其中一个单元格时执行的操作。 (我只是隐藏线然后..)

srcolling 时,你也必须Invalidate DGV!