Comment définir une icône pour un ListViewSubItem?

Dans un ListView, vous pouvez avoir des icons sur chaque élément.
Lors de l’affichage en mode Détails, l’icône est affichée dans la colonne la plus à gauche.

Puis-je afficher une icône dans une autre colonne?

Le contrôle ListView ne prend pas en charge les images dans les sous-éléments de manière native. La solution la plus simple consiste à basculer vers un DataGridView et à utiliser un DataGridViewImageColumn . Si cela n’est pas possible, vous devrez alors dessiner vous-même les icons à l’aide du support de dessin personnalisé ListView contrôle ListView . Pour ce faire, définissez ListView.OwnerDraw = true et gérez les événements ListView.DrawSubItem et ListView.DrawColumnHeader .

 private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) { // Only interestd 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; } 

Utilisez P / Invoke et envoyez le message LVM_SETITEM à la liste (vous devez définir le style LVS_EX_SUBITEMIMAGES lors de la création du contrôle ou via LVM_SETEXTENDEDLISTVIEWSTYLE), spécifier l’index de sous-élément et l’index d’image correspondant. Vous devrez le faire pour chaque élément de la liste que vous insérez.

ObjectListView est un wrapper open source autour d’un .NET Winforms ListView. Il prend en charge les images sur les sous-éléments en utilisant la stratégie p / invoke que @ ligget78 a mentionnée. Il résout également de nombreux autres problèmes courants avec un ListView.

Cela vous permet de faire de très belles ListViews avec un minimum d’effort:

texte alt http://soffr.miximages.com/c%23/fancy-screenshot2.png

Hériter de ListView et dessiner vos propres icons.

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

L’icône est affichée dans la “première” colonne et constitue également la base de la recherche de préfixe au clavier. Une solution possible pourrait être de réorganiser les colonnes en définissant le DisplayIndex de la première colonne sur quelque chose d’autre.

 listView1.Columns[0].DisplayIndex = 1; 

Cela ne fonctionne bien entendu que si vous avez besoin d’une icône dans une seule colonne.

Il n’y a pas de support .NET pour cela.

Regardez ce projet.

Prenez un butin à ceci:

http://social.msdn.microsoft.com/forums/en-US/winforms/thread/d25b4ffa-2ea4-43cd-a3ae-8dd0387197ae/

Outre la réponse acceptée, vous devez également gérer l’événement DrawItem, sinon cela ne fonctionnera pas.