在 ListView 中,您可以在每个项目上都有图标。
在详细信息模式下查看时,图标显示在最左侧的列中。
我可以在其他列中显示图标吗?
在 ListView 中,您可以在每个项目上都有图标。
在详细信息模式下查看时,图标显示在最左侧的列中。
我可以在其他列中显示图标吗?
该ListView
控件本身不支持子项中的图像。最简单的方法是切换到 aDataGridView
并使用 a DataGridViewImageColumn
。如果这不可能,那么您需要使用ListView
控件中的自定义绘制支持自己绘制图标。为此设置ListView.OwnerDraw = true
并处理ListView.DrawSubItem
andListView.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消息发送到列表视图(您应该在控件创建时或通过 LVM_SETEXTENDEDLISTVIEWSTYLE 设置 LVS_EX_SUBITEMIMAGES 样式),指定子项索引和相应的图像索引。您需要为插入的每个列表项执行此操作。
ObjectListView是一个围绕 .NET Winforms ListView 的开源包装器。它使用@ligget78 提到的 p/invoke 策略支持子项上的图像。它还解决了 ListView 的许多其他常见问题。
它允许您以最少的努力制作非常漂亮的 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 事件,否则它将不起作用。