Как я могу установить значок для ListViewSubItem?

В ListView вы можете иметь значки для каждого элемента.
При просмотре в режиме подробной информации значок отображается в крайнем левом столбце.

Можно ли показать значок в другом столбце?

Ответ 1

Элемент ListView не поддерживает изображения в подпунктах изначально. Самое простое - переключиться на DataGridView и использовать DataGridViewImageColumn. Если это невозможно, вам нужно будет нарисовать значки самостоятельно, используя поддержку пользовательского рисования в элементе управления ListView. Для этого установите ListView.OwnerDraw = true и обработайте события ListView.DrawSubItem и ListView.DrawColumnHeader.

private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
    // Only interested in 2nd column.
    if (e.Header != this.columnHeader2)
    {
        e.DrawDefault = true;
        return;
    }

    e.DrawBackground();
    var imageRect = new Rectangle(e.Bounds.X, e.Bounds.Y, e.Bounds.Height, e.Bounds.Height);
    e.Graphics.DrawImage(SystemIcons.Information.ToBitmap(), imageRect);
}

private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
{
    e.DrawDefault = true;
}

Ответ 2

Используйте P/Invoke и отправьте сообщение LVM_SETITEM в список (вы должны установить стиль LVS_EX_SUBITEMIMAGES при создании элемента управления или через LVM_SETEXTENDEDLISTVIEWSTYLE), укажите подпункт индекс и соответствующий индекс изображения. Вам нужно будет сделать это для каждого элемента списка, который вы вставляете.

Ответ 3

ObjectListView - это оболочка с открытым исходным кодом вокруг .NET Winforms ListView. Он поддерживает изображения на подэлементах, используя стратегию p/invoke, о которой упоминал @ligget78. Это также решает многие другие распространенные проблемы с ListView.

Это позволяет создавать очень красивые списки с минимальными усилиями:

alt text
(источник: sourceforge.net)

Ответ 4

Наследовать от ListView и нарисовать собственные значки.

public class MyListView : ListView
{
    protected override void OnDrawSubItem(System.Windows.Forms.DrawListViewSubItemEventArgs e)
    {
        base.OnDrawSubItem(e);
    }
}

Ответ 5

Значок отображается в столбце "первый", и это также является основой для поиска префикса клавиатуры. Одним из возможных решений может быть изменение порядка столбцов путем установки DisplayIndex первого столбца на что-то еще.

listView1.Columns[0].DisplayIndex = 1;

Это, конечно, работает только если вам нужен значок только в одном столбце.