如何为ListViewSubItem设置图标?

lei*_*ren 13 .net c# listview listviewitem winforms

在ListView中,您可以在每个项目上添加图标.
在详细信息模式下查看时,图标显示在最左侧的列中.

我可以在其他列中显示图标吗?

小智 13

ListView控件本身不支持子项中的图像.最简单的方法是切换到a DataGridView并使用a DataGridViewImageColumn.如果那是不可能的,那么您需要使用ListView控件中的自定义绘图支持自己绘制图标.要做到这一点,设置ListView.OwnerDraw = true和处理ListView.DrawSubItemListView.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;
}
Run Code Online (Sandbox Code Playgroud)


lig*_*t78 7

使用P/Invoke并将LVM_SETITEM消息发送到列表视图(您应该在控件创建时或通过LVM_SETEXTENDEDLISTVIEWSTYLE设置LVS_EX_SUBITEMIMAGES样式),指定子项索引和相应的图像索引.您需要为插入的每个列表项执行此操作.


Gra*_*ian 5

ObjectListView是围绕.NET Winforms ListView的开源包装器.它使用@ ligget78提到的p/invoke策略支持子项目上的图像.它还解决了ListView的许多其他常见问题.

它允许您以最小的努力制作非常好看的ListView:

alt text http://objectlistview.sourceforge.net/cs/_images/fancy-screenshot2.png