Рисование изображения в подэлементе в 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?

 Cory29 июн. 2009 г., 15:37
Мне не нужно рисовать заголовок столбца или рисовать элемент ... только подэлемент. Но когда я устанавливаю OwnerDraw = true, я вынужден рисовать все 3. Есть ли способ только рисовать подэлемент?

Ответы на вопрос(4)

Решение Вопроса

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

e.DrawDefault = true;

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

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

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

С несколькими строками кода вот как может выглядеть ваш ListView: альтернативный текст http://objectlistview.sourceforge.net/cs/_images/fancy-screenshot.png

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

Только ручка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;

Ваш ответ на вопрос