2009-12-11 14 views

Respuesta

10

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; 
} 
+0

¿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

+0

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. –

2

Heredar del ListView y sacar sus propios iconos.

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

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.

0

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.

Cuestiones relacionadas