2009-11-24 51 views

Respuesta

7

Usted puede hacer esto mediante el establecimiento de la DrawMode a OwnerDrawFixed que le permite dibujar manualmente los elementos usando el evento DrawItem.

comboBox1.DrawMode = DrawMode.OwnerDrawFixed; 
comboBox1.DrawItem += new DrawItemEventHandler(comboBox1_DrawItem); 

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e) {  
    Font font = comboBox1.Font; 
    Brush brush = Brushes.Black; 
    string text = comboBox1.Items[e.Index]; 

    if (you want bold) 
     font = new Font(font, FontStyle.Bold); 

    if (you want green) 
     brush = Brushes.Green; 

    e.Graphics.DrawString(text, font, brush, e.Bounds); 
} 
0

No, no hay una propiedad incorporada para hacerlo. Tendrás que construir tu propio control y anular el renderizado.

11

Tan antigua como esta publicación es, me pareció útil como punto de partida para buscar pero terminé teniendo mejores resultados utilizando el método que se muestra here por @Paul.

Aquí está el código que solía hacer condicionalmente los elementos en un cuadro combinado aparecen en negrita, creo que la respuesta correcta para esta pregunta tiene un comportamiento extraño: al pasar el ratón sobre un elemento va un poco más audaz y se mantiene así si se vuelve a dibujar. Este código da como resultado un aspecto más natural:

private void ComboBox1_DrawItem(object sender, DrawItemEventArgs e) 
     { 
      if (e.Index == -1) 
       return; 
      ComboBox combo = ((ComboBox)sender); 
      using (SolidBrush brush = new SolidBrush(e.ForeColor)) 
      { 
       Font font = e.Font; 
       if (/*Condition Specifying That Text Must Be Bold*/) 
        font = new System.Drawing.Font(font, FontStyle.Bold); 
       e.DrawBackground(); 
       e.Graphics.DrawString(combo.Items[e.Index].ToString(), font, brush, e.Bounds); 
       e.DrawFocusRectangle(); 
      } 

     } 
2

sólo para añadir a la respuesta suministrada por Dan, no se olvide que si usted ha atado la lista a un origen de datos, en lugar de sólo tener un cuadro combinado con las cadenas de civil , no podrá volver a dibujar la entrada utilizando combo.Items[e.Index].ToString().

Si, por ejemplo, ha vinculado el ComboBox a una DataTable y trata de usar el código en la respuesta de Dan, terminará con un ComboBox que contiene System.Data.DataRowView, ya que cada elemento de la lista no es cadena, es un DataRowView.

El código en este caso sería algo así como lo siguiente:

private void ComboBox1_DrawItem(object sender, DrawItemEventArgs e) 
      { 
       if (e.Index == -1) 
        return; 
       ComboBox combo = ((ComboBox)sender); 

       using (SolidBrush brush = new SolidBrush(e.ForeColor)) 
       { 
        Font font = e.Font; 
        DataRowView item = (DataRowView)combo.Items[e.Index]; 

        if (/*Condition Specifying That Text Must Be Bold*/) { 
         font = new System.Drawing.Font(font, FontStyle.Bold); 
        } 
        else { 
         font = new System.Drawing.Font(font, FontStyle.Regular); 
        }      

        e.DrawBackground(); 
        e.Graphics.DrawString(item.Row.Field<String>("DisplayMember"), font, brush, e.Bounds); 
        e.DrawFocusRectangle(); 
       } 

      } 

Dónde "DisplayMember" es el nombre del campo que se mostrará en la lista (establecido en la propiedad ComboBox1.DisplayMember).

Cuestiones relacionadas