将图像绘制到ListView中的子项

时间:2009-06-26 17:06:52

标签: c# winforms listview

我的列表视图在详细信息视图中设置,并带有以下列标题:

图片名称||图像位置||图像尺寸||图像预览

我想知道是否有办法在第4栏中绘制图像。我知道的唯一方法是设置

this.listview1.OwnerDraw = true
this.listView1.DrawColumnHeader += new System.Windows.Forms.DrawListViewColumnHeaderEventHandler(listView1_DrawColumnHeader);
this.listView1.DrawItem += new System.Windows.Forms.DrawListViewItemEventHandler(listView1_DrawItem);
this.listView1.DrawSubItem += new System.Windows.Forms.DrawListViewSubItemEventHandler(listView1_DrawSubItem);

这个问题是我必须自己处理所有列表视图... 我想知道是否有更好的方法将图像绘制到subItem,或者是否有办法只处理DrawSubItem事件?

4 个答案:

答案 0 :(得分:7)

我刚碰到这个。

@zidane's answer几乎是正确的。我想发布实际需要做的事情,以便后来回读的人不必自己解决这个问题。


仅使用DrawColumnHeader处理e.DrawDefault = true;和子项目图。事实上,如果您在e.DrawDefault = true;事件中设置DrawItem,则DrawSubItem事件永远不会触发,大概是假设您要绘制整行并且不关心子项

唯一真实的代码在DrawSubItem,使用这个基本结构:

if (/* condition to determine if you want to draw this subitem */)
{
    // Draw it
}
else
    e.DrawDefault = true;

答案 1 :(得分:2)

ObjectListView(围绕.NET WinForms ListView的开源包装器)简单地支持在列中绘制图像,而无需自己绘制所有所有者。演示的“数据”选项卡显示动画GIF,这有点OTT但它对静态图像同样有效。

使用几行代码,这就是ListView的外观: alt text
(来源:sourceforge.net

答案 2 :(得分:0)

listView1_DrawColumnHeaderlistView1_DrawItem事件处理程序中,您应该将此

e.DrawDefault = true;

它将使用列和项的默认绘图实现,您只需要为子项编写自己的实现。

答案 3 :(得分:0)

基于以前的答案,这是一个完整的VB.NET示例:

Public Class MyListView : Inherits System.Windows.Forms.ListView

Public Sub New()
    MyBase.New()
    MyBase.OwnerDraw = True
End Sub

Protected Overrides Sub OnDrawSubItem(ByVal e As DrawListViewSubItemEventArgs)
    If x Then ' condition to determine if you want to draw this subitem
        ' draw code goes here
    Else
        e.DrawDefault = True
    End If
    MyBase.OnDrawSubItem(e)
End Sub

Protected Overrides Sub OnDrawColumnHeader(ByVal e As DrawListViewColumnHeaderEventArgs)
    e.DrawDefault = True
    MyBase.OnDrawColumnHeader(e)
End Sub

Protected Overrides Sub OnDrawItem(e As System.Windows.Forms.DrawListViewItemEventArgs)
    e.DrawDefault = True
    MyBase.OnDrawItem(e)
End Sub

End Class