我想在我的DataGridView中实现类似于MsExcel中的“Dependent cells”的功能,如下图所示。 最好的是某种绘制函数,它将目标和依赖的datagridviewcell地址作为参数,并在datagridview上绘制箭头。 知道怎么做吗?
答案 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事件中添加了代码以添加到列表中。结果如下:
您可以添加代码来设置绘图样式,例如添加StartCap
或使用不同的颜色等。
与往常一样,每当您添加或删除要连接的单元格列表中的元素时,您都需要在Invalidate()
上调用DGV
。
请注意,这只是一个最小的例子。您将需要添加代码以捕获各种错误或决定在未显示其中一个单元格时执行的操作。 (我只是隐藏线然后..)
当 srcolling 时,你也必须Invalidate
DGV!