En un ListView puede tener iconos en cada elemento.
Al visualizar en modo Detalles, el icono se muestra en la columna de la izquierda.¿Cómo puedo configurar un ícono para un ListViewSubItem?
¿Puedo mostrar un icono en alguna otra columna?
En un ListView puede tener iconos en cada elemento.
Al visualizar en modo Detalles, el icono se muestra en la columna de la izquierda.¿Cómo puedo configurar un ícono para un ListViewSubItem?
¿Puedo mostrar un icono en alguna otra columna?
El ListView
de control no soporta imágenes en subtemas de forma nativa. Lo más fácil es cambiar a un DataGridView
y usar un DataGridViewImageColumn
. Si eso no es posible, deberá dibujar los iconos usted mismo utilizando el soporte de sorteo personalizado en el control ListView
. Para hacer esto, establezca ListView.OwnerDraw = true
y maneje los eventos ListView.DrawSubItem
y 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;
}
No hay soporte de .NET para esto.
Heredar del ListView y sacar sus propios iconos.
public class MyListView : ListView
{
protected override void OnDrawSubItem(System.Windows.Forms.DrawListViewSubItemEventArgs e)
{
base.OnDrawSubItem(e);
}
}
uso P/Invoke y enviar LVM_SETITEM mensaje a la vista de lista (que deben establecer el estilo LVS_EX_SUBITEMIMAGES en la creación de control o mediante LVM_SETEXTENDEDLISTVIEWSTYLE), especificar el índice y el índice subelemento de imagen correspondiente. Tendrá que hacerlo por cada elemento de la lista que inserte.
ObjectListView es un contenedor de código abierto alrededor de .NET Winforms ListView. Admite imágenes en subelementos utilizando la estrategia p/invoke que mencionó @ ligget78. También resuelve muchos otros problemas comunes con un ListView.
Se le permite hacer muy buenas listviews que buscan con un mínimo esfuerzo:
alt text http://objectlistview.sourceforge.net/cs/_images/fancy-screenshot2.png
Tome un botín en este:
http://social.msdn.microsoft.com/forums/en-US/winforms/thread/d25b4ffa-2ea4-43cd-a3ae-8dd0387197ae/
Además de la respuesta aceptada, se también debe manejar el evento DrawItem o no funcionará.
El icono se muestra en la "primera" columna, y esta es también la base para la búsqueda del prefijo del teclado. Una posible solución podría ser reordenar las columnas estableciendo DisplayIndex de la primera columna en otra cosa.
listView1.Columns[0].DisplayIndex = 1;
Esto, por supuesto, solo funciona si necesita un icono en una sola columna.
¿por qué no simplemente 'var imageRect = e.Bounds;' Es un tipo de valor por lo que los valores se van a copiar y no se hace referencia para que sean seguros de manejar. – ja72
Exposición, en el uso del mundo real, es posible que desee ajustar imageRect para tener en cuenta la alineación, el relleno y/o el contenido adicional contenido en el subelemento. –