如何为ListViewSubItem设置图标?

时间:2009-12-11 14:48:47

标签: c# .net winforms listview listviewitem

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

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

7 个答案:

答案 0 :(得分:13)

ListView控件本身不支持子项中的图像。最简单的方法是切换到DataGridView并使用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;
}

答案 1 :(得分:6)

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

答案 2 :(得分:5)

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

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

alt text
(来源:sourceforge.net

答案 3 :(得分:2)

从ListView继承并绘制自己的图标。

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

答案 4 :(得分:1)

图标显示在"第一个"列,这也是键盘前缀搜索的基础。一种可能的解决方案是通过将第一列的DisplayIndex设置为其他值来重新排序列。

listView1.Columns[0].DisplayIndex = 1;

这当然只有在一列中只需要一个图标时才有效。

答案 5 :(得分:0)

没有.NET支持。

Have a look at this project.

答案 6 :(得分:0)

抓住这个战利品:

http://social.msdn.microsoft.com/forums/en-US/winforms/thread/d25b4ffa-2ea4-43cd-a3ae-8dd0387197ae/

除了接受的答案外,您还应该处理DrawItem事件,否则它将无效。