我在DatagridView
中显示了一些行,它们将第一列作为ImageandText。当用户通过将图像背景保持为白色来选择我想要选择的任何行,直到具有文本部分的单元格。
用于在DataGridView的第一个单元格中显示图像和文本的代码:
private void dgvLogDetails_CellPainting(object sender,
DataGridViewCellPaintingEventArgs e)
{
if (e.RowIndex >= 0 && e.ColumnIndex == 0)
{
e.PaintBackground(e.ClipBounds, true);
PointF p = e.CellBounds.Location;
e.CellStyle.SelectionBackColor = Color.White;
p.X += imgList.ImageSize.Width+8;
e.Graphics.DrawImage(imgList.Images[1], e.CellBounds.X+4,
e.CellBounds.Y, 16, 16);
e.Graphics.DrawString(e.Value.ToString(),
e.CellStyle.Font, Brushes.Black, p);
e.Handled = true;
}
}
上面的代码选择完整的单元格(图像和文本),如下图所示:
我希望有如下图所示的内容[预期]:
尝试过Sriram代码,显示如下:
答案 0 :(得分:1)
这样的事情应该可以解决问题。
调用e.PaintBackground
,将第二个参数设置为false
,这意味着它不会为您绘制选择背景,然后您可以自己绘制。
private void dgvLogDetails_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (e.RowIndex >= 0 && e.ColumnIndex == 0)
{
Bitmap image = imgList.Images[1];//Get the image somewhow
bool selected = e.State.HasFlag(DataGridViewElementStates.Selected);
e.PaintBackground(e.ClipBounds, false);
PointF p = e.CellBounds.Location;
p.X += image.Size.Width + 8;
if (selected)
{
RectangleF newRect = new RectangleF(new PointF(e.CellBounds.Left + image.Size.Width, e.CellBounds.Top), new SizeF(e.CellBounds.Width - image.Size.Width, image.Height));
using(SolidBrush brush = new SolidBrush(e.CellStyle.SelectionBackColor))
e.Graphics.FillRectangle(brush, newRect);
}
e.Graphics.DrawImage(imgList.Images[1], e.CellBounds.X+4,
e.CellBounds.Y, 16, 16);
e.Graphics.DrawString(e.Value.ToString(),
e.CellStyle.Font, Brushes.Black, p);
e.Handled = true;
}
}
这是它呈现的输出: