2009-12-11 12 views

risposta

10

Il controllo ListView non supporta le immagini in sottovoci in modo nativo. La cosa più semplice da fare è passare a DataGridView e utilizzare uno DataGridViewImageColumn. Se ciò non è possibile, dovrai disegnare tu stesso le icone usando il supporto del disegno personalizzato nel controllo ListView. Per eseguire questa operazione, impostare ListView.OwnerDraw = true e gestire gli eventi ListView.DrawSubItem e ListView.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; 
} 
+0

perché non solo 'var imageRect = e.Bounds;' È un tipo di valore in modo che i valori vengano copiati e non referenziati per renderli sicuri da gestire. – ja72

+0

Esposizione, nel mondo reale si potrebbe voler regolare imageRect per tenere conto di allineamento, riempimento e/o contenuto aggiuntivo contenuto nel sottoelemento. –

2

Eredita da ListView e trarre le vostre icone.

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

Usa P/Invoke e inviare LVM_SETITEM messaggio al ListView (è necessario impostare lo stile LVS_EX_SUBITEMIMAGES sulla creazione di controllo o tramite LVM_SETEXTENDEDLISTVIEWSTYLE), specificare l'indice sottovoce e l'indice di immagine corrispondente. Dovrai farlo per ogni elemento della lista che inserisci.

0

L'icona viene visualizzata nella "prima" colonna e questa è anche la base per la ricerca del prefisso della tastiera. Una possibile soluzione potrebbe essere quella di riordinare le colonne impostando DisplayIndex della prima colonna su qualcos'altro.

listView1.Columns[0].DisplayIndex = 1; 

Questo ovviamente funziona solo se è necessaria un'icona in una sola colonna.

Problemi correlati