Рисование изображения в подэлементе в ListView - PullRequest
5 голосов
/ 26 июня 2009

My Listview настраивается в подробном представлении со следующими заголовками столбцов:

Название изображения || Расположение изображения || Размер изображения || Предварительный просмотр изображения

Я хотел бы знать, есть ли способ нарисовать изображение в 4-м столбце там. Единственный способ, которым я знаю, это установить

this.listview1.OwnerDraw = true
this.listView1.DrawColumnHeader += new System.Windows.Forms.DrawListViewColumnHeaderEventHandler(listView1_DrawColumnHeader);
this.listView1.DrawItem += new System.Windows.Forms.DrawListViewItemEventHandler(listView1_DrawItem);
this.listView1.DrawSubItem += new System.Windows.Forms.DrawListViewSubItemEventHandler(listView1_DrawSubItem);

Проблема в том, что я должен сам обрабатывать ВСЕ чертежи списка ... Мне было интересно, есть ли лучший способ рисовать изображение в подэлементе, или есть ли способ обрабатывать только событие DrawSubItem?

Ответы [ 4 ]

7 голосов
/ 16 декабря 2010

Я только что столкнулся с этим.

@ ответ Зидана почти правильный. Я хочу опубликовать то, что на самом деле нужно сделать, чтобы люди, читающие позже, не могли сами это выяснить.


Обрабатывать только DrawColumnHeader, используя e.DrawDefault = true; и чертеж подэлемента. Фактически, если вы установите e.DrawDefault = true; в событии DrawItem, событие DrawSubItem никогда не сработает, предположительно, если вы хотите нарисовать всю строку и не заботиться о подпунктах.

Единственный реальный код находится в DrawSubItem, используя эту базовую конструкцию:

if (/* condition to determine if you want to draw this subitem */)
{
    // Draw it
}
else
    e.DrawDefault = true;
2 голосов
/ 14 июля 2009

ObjectListView (обертка с открытым исходным кодом вокруг .NET WinForms ListView) тривиально поддерживает рисование изображений в столбцах без необходимости делать все рисование владельцем самостоятельно.На вкладке «Данные» демо-версии показаны анимированные GIF-файлы, которые немного OTT, но одинаково хорошо будут работать со статическими изображениями.

С несколькими строками кода ваш ListView может выглядеть так:alt text
(источник: sourceforge.net )

0 голосов
/ 25 сентября 2012

Основываясь на предыдущих ответах, вот полный пример VB.NET:

Public Class MyListView : Inherits System.Windows.Forms.ListView

Public Sub New()
    MyBase.New()
    MyBase.OwnerDraw = True
End Sub

Protected Overrides Sub OnDrawSubItem(ByVal e As DrawListViewSubItemEventArgs)
    If x Then ' condition to determine if you want to draw this subitem
        ' draw code goes here
    Else
        e.DrawDefault = True
    End If
    MyBase.OnDrawSubItem(e)
End Sub

Protected Overrides Sub OnDrawColumnHeader(ByVal e As DrawListViewColumnHeaderEventArgs)
    e.DrawDefault = True
    MyBase.OnDrawColumnHeader(e)
End Sub

Protected Overrides Sub OnDrawItem(e As System.Windows.Forms.DrawListViewItemEventArgs)
    e.DrawDefault = True
    MyBase.OnDrawItem(e)
End Sub

End Class
0 голосов
/ 11 августа 2009

В listView1_DrawColumnHeader и listView1_DrawItem обработчиках событий вы должны поставить это

e.DrawDefault = true;

Он будет использовать реализацию чертежа по умолчанию для столбцов и элементов, все, что вам нужно сделать, это написать свою собственную реализацию только для подпунктов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...