.NET ListView поддерживает рисование владельца гораздо более непосредственно, чем предлагают другие ответы. Вам даже не нужно создавать подклассы. Установите для OwnerDraw значение true, прослушивайте событие DrawSubItem, а затем в этом случае вы можете нарисовать то, что вам нравится.
Как всегда, ObjectListView облегчает этот процесс. эта страница документирует, как это сделать. Вы можете создавать такие вещи, если вы чувствуете себя обидными для своих пользователей:
ОДНАКО, ни один из этих методов не сработает, если вы хотите нарисовать что-то за пределами самой ячейки. Таким образом, если вы надеялись нарисовать контур выделения вокруг всей строки, которая перекрывала предыдущие и последующие строки, вы не сможете сделать это с помощью чертежа владельца. Каждая ячейка рисуется индивидуально и «владеет» своей частью экрана, уничтожая все, что там уже было.
Чтобы сделать что-то, о чем вы просите, вам нужно перехватить этап посткраски пользовательского рисования (не рисование владельца. Майкл Данн написал отличное введение в пользовательский рисунок для CodeProject). Вы можете прочитать, что требуется здесь .
Мне неприятно это говорить, но самый простой ответ - использовать ObjectListView, создать украшение и установить его:
public void InitializeSelectionOverlay()
{
this.olv1.HighlightForegroundColor = Color.Black;
this.olv1.HighlightBackgroundColor = Color.White;
this.olv1.AddDecoration(new SelectedRowDecoration());
}
public class SelectedRowDecoration : IOverlay
{
public void Draw(ObjectListView olv, Graphics g, Rectangle r) {
if (olv.SelectedIndices.Count != 1)
return;
Rectangle rowBounds = olv.GetItem(olv.SelectedIndices[0]).Bounds;
rowBounds.Inflate(0, 2);
GraphicsPath path = this.GetRoundedRect(rowBounds, 15);
g.DrawPath(new Pen(Color.Red, 2.0f), path);
}
private GraphicsPath GetRoundedRect(RectangleF rect, float diameter) {
GraphicsPath path = new GraphicsPath();
RectangleF arc = new RectangleF(rect.X, rect.Y, diameter, diameter);
path.AddArc(arc, 180, 90);
arc.X = rect.Right - diameter;
path.AddArc(arc, 270, 90);
arc.Y = rect.Bottom - diameter;
path.AddArc(arc, 0, 90);
arc.X = rect.Left;
path.AddArc(arc, 90, 90);
path.CloseFigure();
return path;
}
}
Это дает что-то похожее на это: