Come posso impostare un'icona per un ListViewSubItem?
-
19-09-2019 - |
Domanda
In un ListView è possibile avere le icone su ciascuna voce.
Durante la visualizzazione di dettagli-modalità, l'icona viene visualizzata nella colonna più a sinistra.
Posso mostrare un'icona in qualche altra colonna?
Soluzione
Il controllo ListView
non supporta le immagini in sotto-voci in modo nativo. La cosa più semplice da fare è passare a un DataGridView
e utilizzare un DataGridViewImageColumn
. Se questo non è possibile, allora avrete bisogno di disegnare le icone da soli utilizzando il supporto pareggio personalizzato nel controllo ListView
. Per fare questo insieme 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;
}
Altri suggerimenti
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. Sarà necessario farlo per ogni elemento della lista si inserisce.
ObjectListView è una fonte involucro aperto intorno a un ListView NET WinForms. Supporta le immagini su elementi secondari che utilizzano il P / Invoke strategia che che @ ligget78 menzionato. Risolve anche molti altri problemi comuni con un controllo ListView.
E 'ti permette di fare molto bello ListViews guardando con un minimo sforzo:
(fonte: sourceforge.net )
Eredita da ListView e trarre le vostre icone.
public class MyListView : ListView
{
protected override void OnDrawSubItem(System.Windows.Forms.DrawListViewSubItemEventArgs e)
{
base.OnDrawSubItem(e);
}
}
L'icona viene visualizzata nella colonna "prima", e questa è anche la base per la ricerca del prefisso tastiera. Una possibile soluzione potrebbe essere quella di riordinare le colonne impostando la DisplayIndex della prima colonna a qualcos'altro.
listView1.Columns[0].DisplayIndex = 1;
Questo ovviamente funziona solo se avete bisogno di un'icona in una sola colonna.
Non c'è alcun supporto .NET per questo.
Date bottino a questo:
In aggiunta alla risposta accettata, è necessario gestire l'evento DrawItem così, o non funzionerà.