显示上述问题的图片:
这是我用于在选择单元格周围绘制边框的代码:
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;
}
}
}
}
}
有没有办法让它们不消失?它不会发生在底部和右边界。我尝试过几件事情,包括:
答案 0 :(得分:1)
问题是两个绘画事件是冲突的:
实际上情况更糟,取决于你如何移动选择,特别是当你向上或向下移动时,因为现在不仅画了选区而且还恢复了之前的选择,破坏了上面单元格中的红色边框或者下面也是!
我不确定为什么这种情况不对称;也许这是旧的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的回答(当时能够发表评论)并没有解决问题,但让我思考。我需要在绘制任何其他单元格时使这些单元格无效,因此我将事件处理程序添加到以下内容中:
而不是使相邻单元格无效,因为它似乎没有工作,我使该列的显示列矩形无效,因为它是目前唯一具有自定义边界单元格的列。