Lilypie Primer PicLilypie Primer Ticker

lunes, 26 de marzo de 2007

Un ComboBox con imágenes

Update: Actualizado en www.MiCodigo.info

En este post les mostraré una forma de incluir imágenes al lado de cada elemento de un ComboBox , asi:





Para ello necesitaremos un Windows Form en el que incluiremos un control ComboBox y un Componente ImageList.



En el ImageList cargamos las imágenes que queremos mostrar. En lo posible, el tamaño de estas imágenes debe ser de 16x16.





Ahora necesitamos crear una clase muy simple que nos permita almacenar la etiqueta de los elementos del Combo y el índice de la imagen en el ImageList.



class ComboItem

{
private int _imageIndex;
private string _etiqueta;

public string Etiqueta
{
get { return _etiqueta; }
set { _etiqueta = value; }
}

public int ImageIndex
{
get { return _imageIndex; }
set { _imageIndex = value; }
}

public ComboItem(string etiqueta, int imageIndex)
{
this.Etiqueta = etiqueta;
this.ImageIndex = imageIndex;
}

public override string ToString()
{
return Etiqueta;
}
}

Nada más, ahora lo único que tenemos que hacer es añadir instancias de la clase ComboItem en nuestro comboBox, podemos hacerlo en el evento Load asi:


private void Form1_Load(object sender, EventArgs e)
{
comboBox1.Items.Add(new ComboItem("Aumentar", 0));
comboBox1.Items.Add(new ComboItem("Disminuir", 1));
comboBox1.Items.Add(new ComboItem("---------", -1));
comboBox1.Items.Add(new ComboItem("Editar", 2));
}

Nótese que el tercer item tiene el índice -1. Usaremos -1 para indicar que un elemento no tiene una imagen asociada.


Ahora si, la verdadera acción:


Primero debemos modificar la propiedad DrawMode del ComboBox, y fijarla en OwnerDrawFixed.


Y finalmente añadimos un manejador para el evento DrawItem del ComboBox, asi:



private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
ComboItem item = comboBox1.Items[e.Index] as ComboItem;
e.DrawBackground();
if (item.ImageIndex >= 0 && item.ImageIndex < imageList1.Images.Count)
e.Graphics.DrawImage(imageList1.Images[item.ImageIndex], new PointF(e.Bounds.Left, e.Bounds.Top));
e.Graphics.DrawString(item.Etiqueta, e.Font, new SolidBrush(e.ForeColor), new PointF(e.Bounds.Left + imageList1.ImageSize.Width + 1, e.Bounds.Top));
}




Eso es todo, nuestro ComboBox ahora muestra su imagen asociada a su izquierda.

En un siguiente post, mostraré cómo se puede crear un control derivado de ComboBox que incluya todo este procedimiento de modo que sea reutilizable.

15 comentarios:

Anónimo dijo...

Excelente. He aprendido un par de cosillas que me van a ser muy utiles. Gracias

Anónimo dijo...

hola, está genial pero sólo un detalle ¿No se puede hacer que la imagen aparezca en el combobox una vez se haya seleccionado la opción deseada? Es decir, que la imagen aparezca cuando no está el combobox desplegado para seleccionar.

Muchas gracias

Anónimo dijo...

Pues si me enseñas, me harás un gran favor. Soy novato y autodidacta, así que me cuesta un poquito. Mil gracias por anticipado.

Anónimo dijo...

Excelente!!!! probado con un listBox y funciona exactamente igual.

Enhorabuena y gracias.

Anónimo dijo...

para que la imagen aparezca en la opción seleccionada hay que configurar la opcion DropDownStyle como DropDownList

Pedro dijo...

Este ejemplo como se haría con un enlace a un dataview?.

Anónimo dijo...

¿Alguien me podria a ayudar a pasar este ejemplo a vb.net?

Creo que tengo la clase creada correctamente.

Public Class listItem

Private _imageIndex As Integer
Private _etiqueta As String

Public Property ImageIndex As Integer
Get
Return _imageIndex
End Get
Set(ByVal value As Integer)
_imageIndex = value
End Set
End Property

Public Property Etiqueta As String
Get
Return _etiqueta
End Get
Set(ByVal value As String)
_etiqueta = value
End Set
End Property

Public Sub listItem(etiqueta As String, imageIndex As Integer)
Me.Etiqueta = etiqueta
Me.ImageIndex = imageIndex
End Sub

Public Overrides Function ToString() As String
Return Etiqueta
End Function

End Class

Unknown dijo...

que tal, me podrían decir como asignar un valor a la propiedad de "value" y/o "text" del item del comboBox, ya que de la forma en la que lo realizas solo puedo obtener la etiqueta en la propiedad ComboBox.SelectedItem y requiero asignar un valor numerico a cada elemento distinto al index, gracias

saludos

Anónimo dijo...

No me funcionó en VB.net 2010

salen miles de errores

Anónimo dijo...

Pro favor una ayudita. Si esto se quiere hacer con webforms, no con winform, cómo se hace? Muchas gracias !!!!

Josep. dijo...

Hola y buenos dias a todos.
He utilizado el codigo arriba publicado, y necesitaria completarlo para que en la opcion seleccionado del ComboBox, tambien apareciera la imagen, cosa que no ocurre ahora.
Creo que alguien ya lo pidio pero no ha habido respuesta.
Saludos y gracias,
Josep.

fidel dijo...

PERFECTO!!!!!!!

Luis dijo...

El del Ejemplo en VB.NET donde creas el Sub "listItem" por "New"

Public Sub listItem(etiqueta As String, imageIndex As Integer)
Me.Etiqueta = etiqueta
Me.ImageIndex = imageIndex
End Sub

Cambiarlo a

Public Sub New(etiqueta As String, imageIndex As Integer)
Me.Etiqueta = etiqueta
Me.ImageIndex = imageIndex
End Sub

Anónimo dijo...

hice todo el código y no me aparecen ni las letras, en el textbox

Anónimo dijo...

*combobox