选中时,相邻单元格(顶部和左侧)在自定义绘制边框上绘制

时间:2015-02-12 01:02:45

标签: c# winforms datagridview

显示上述问题的图片:

http://imgur.com/a/vFvRr

这是我用于在选择单元格周围绘制边框的代码:

private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (e.ColumnIndex > 0 && e.RowIndex > -1)
    {
        if (e.Value != null && (!e.Value.Equals("0")) && (!e.Value.Equals("-")))
        {
                double d = Convert.ToDouble(e.Value);

                    if (e.ColumnIndex == 2)
                    {
                        int limit = Convert.ToInt16(numericUpDown1.Value);

                        if (d > limit)
                        {
                                int pWidth = 1;
                                Pen p = new Pen(Color.Red, pWidth);
                                e.PaintBackground(e.CellBounds, true);
                                e.PaintContent(e.CellBounds);
                                int x = e.CellBounds.Left – pWidth;
                                int y = e.CellBounds.Top – pWidth;
                                int w = e.CellBounds.Width;
                                int h = e.CellBounds.Height;
                                e.Graphics.DrawRectangle(p, x,y,w,h);
                                e.Handled = true;
                        }
                    }
          }
    }
}

有没有办法让它们不消失?它不会发生在底部和右边界。我尝试过几件事情,包括:

  • 禁用边框并为所有单元格绘制自己的边框(同一问题)
  • 将绘制矩形调整为单元格内部(不喜欢外观)
  • 处理CellEnter / CellLeave / CellClick以.In使行和列无效,以尝试让自定义边框单元格重新绘制顶部

2 个答案:

答案 0 :(得分:1)

问题是两个绘画事件是冲突的:

  • 你的CellPaint画出漂亮的红色边框..
  • ..和之后,系统会绘制所选单元格,破坏相邻单元格中的红色边框。

实际上情况更糟,取决于你如何移动选择,特别是当你向上或向下移动时,因为现在不仅画了选区而且还恢复了之前的选择,破坏了上面单元格中的红色边框或者下面也是!

我不确定为什么这种情况不对称;也许这是旧的DrawRectanlge错误,它倾向于将尺寸减去一个。 (这就是为什么你不能画出一个大小为1的矩形;你需要填充它!)或者说事件顺序可能有些奇怪......

尽管如此,您只需使用InvalidateCell强制对受影响的细胞进行新的绘制即可解决问题:

private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
    DataGridViewCell cell = dataGridView1.CurrentCell;
    if (cell.ColumnIndex < dataGridView1.ColumnCount - 1)
    {
        dataGridView1.InvalidateCell(cell.ColumnIndex + 1, cell.RowIndex);
        if (cell.RowIndex > 0) 
            dataGridView1.InvalidateCell(cell.ColumnIndex + 1, cell.RowIndex - 1);
        if (cell.RowIndex < DGV.ColumnCount -1)
            dataGridView1.InvalidateCell(cell.ColumnIndex + 1, cell.RowIndex + 1);
    }
} 

您可能希望针对所有者绘制的列进行优化..

答案 1 :(得分:0)

我尝试了TaWs的回答(当时能够发表评论)并没有解决问题,但让我思考。我需要在绘制任何其他单元格时使这些单元格无效,因此我将事件处理程序添加到以下内容中:

  • CellMouseDown
  • CellMouseUp
  • 的SelectionChanged
  • Form_Activated

而不是使相邻单元格无效,因为它似乎没有工作,我使该列的显示列矩形无效,因为它是目前唯一具有自定义边界单元格的列。