2009-06-26 4 views
5

mio ListView è messa a punto nei dettagli vista con le seguenti intestazioni di colonna:Disegno di un'immagine ad un elemento secondario nella ListView

Nome immagine || Posizione immagine || Dimensione immagine || Image Preview

Mi piacerebbe sapere se c'è un modo per disegnare un'immagine nella quarta colonna lì. L'unico modo che conosco, è quello di impostare

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); 

Il problema di questo è che ho per gestire tutti i listview me stesso disegno ... Mi chiedevo se esiste un modo migliore per disegnare in un'immagine a un elemento secondario o se esiste un modo per gestire solo l'evento DrawSubItem?

+0

Non ho bisogno di disegnare l'intestazione della colonna o Disegna l'elemento ... solo il SubItem. Ma quando imposto OwnerDraw = true, sono costretto a disegnare tutto 3. C'è un modo per disegnare solo il SubItem? –

risposta

0

In listView1_DrawColumnHeader e listView1_DrawItem gestori di eventi si dovrebbe mettere questo

e.DrawDefault = true; 

Userà disegno di default di attuazione colonne e articoli, tutto ciò che devi fare è scrivere la tua implementazione solo per i sottotitoli.

2

ObjectListView (un wrapper open source attorno a .NET WinForms ListView) supporta banalmente il disegno di immagini in colonne senza dover fare tutto il disegno del proprietario. La scheda Dati della demo mostra GIF animate, che è un po 'OTT ma funzionerà altrettanto bene con le immagini statiche.

Con poche righe di codice, questo è ciò che il vostro ListView può apparire come: alt text http://objectlistview.sourceforge.net/cs/_images/fancy-screenshot.png

6

Mi sono imbattuto in questo.

@zidane's answer è quasi corretto. Voglio pubblicare ciò che in realtà deve essere fatto in modo che le persone che leggono più tardi non debbano capirlo da soli.


gestire solo DrawColumnHeader utilizzando e.DrawDefault = true; e il disegno elemento secondario. Infatti, se si imposta e.DrawDefault = true; nell'evento DrawItem, l'evento DrawSubItem non si attiva mai, presumibilmente partendo dal presupposto che si desidera disegnare l'intera riga e non si preoccupano delle voci secondarie.

l'unico codice reale è in DrawSubItem, utilizzando questo costruzione di base:

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

Basandosi sulle risposte precedenti, ecco un esempio VB.NET piena:

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