我想在DataGridView中实现类似于MsExcel的“从属单元格”的功能,如下图所示.
最好的是某种绘画功能,它将目标地址和相关的datagridviewcell地址作为参数,并在datagridview上绘制箭头.
知道怎么做吗?
解决方法:
您可以使用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或使用其他颜色等.
通常,无论何时从要连接的单元列表中添加或删除元素,都需要在DGV上调用Invalidate().
请注意,这只是一个最小的示例.您将需要添加代码来捕获各种错误,或者决定不显示其中一个单元格时该怎么做. (然后,我只是隐藏行了.)
srcolling时,您还必须使DGV失效!