В ListView вы можете иметь значки для каждого элемента.
При просмотре в режиме подробной информации значок отображается в крайнем левом столбце.
Можно ли показать значок в другом столбце?
В ListView вы можете иметь значки для каждого элемента.
При просмотре в режиме подробной информации значок отображается в крайнем левом столбце.
Можно ли показать значок в другом столбце?
Элемент 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;
}
Используйте P/Invoke и отправьте сообщение LVM_SETITEM в список (вы должны установить стиль LVS_EX_SUBITEMIMAGES при создании элемента управления или через LVM_SETEXTENDEDLISTVIEWSTYLE), укажите подпункт индекс и соответствующий индекс изображения. Вам нужно будет сделать это для каждого элемента списка, который вы вставляете.
ObjectListView - это оболочка с открытым исходным кодом вокруг .NET Winforms ListView. Он поддерживает изображения на подэлементах, используя стратегию p/invoke, о которой упоминал @ligget78. Это также решает многие другие распространенные проблемы с ListView.
Это позволяет создавать очень красивые списки с минимальными усилиями:
(источник: sourceforge.net)
Наследовать от ListView и нарисовать собственные значки.
public class MyListView : ListView
{
protected override void OnDrawSubItem(System.Windows.Forms.DrawListViewSubItemEventArgs e)
{
base.OnDrawSubItem(e);
}
}
Значок отображается в столбце "первый", и это также является основой для поиска префикса клавиатуры. Одним из возможных решений может быть изменение порядка столбцов путем установки DisplayIndex первого столбца на что-то еще.
listView1.Columns[0].DisplayIndex = 1;
Это, конечно, работает только если вам нужен значок только в одном столбце.
Нет поддержки .NET для этого.
Возьмите добычу при этом:
http://social.msdn.microsoft.com/forums/en-US/winforms/thread/d25b4ffa-2ea4-43cd-a3ae-8dd0387197ae/
В дополнение к принятому ответу вы также должны обрабатывать событие DrawItem, или оно не будет работать.