2010-12-15 135 views

Respuesta

6

Esto es lo que hice para solucionar esto, funciona muy bien ...

public class ImprovedComboBox : ComboBox 
{ 
    public ImprovedComboBox() 
    { 



    } 
    public object DataSource 
    { 
     get { return base.DataSource; } 
     set { base.DataSource = value; DetermineDropDownWidth(); } 

    } 
    public string DisplayMember 
    { 
     get { return base.DisplayMember; } 
     set { base.DisplayMember = value; DetermineDropDownWidth(); } 

    } 
    public string ValueMember 
    { 
     get { return base.ValueMember; } 
     set { base.ValueMember = value; DetermineDropDownWidth(); } 

    } 
    private void DetermineDropDownWidth() 
    { 

     int widestStringInPixels = 0; 
     foreach (Object o in Items) 
     { 
      string toCheck; 
      PropertyInfo pinfo; 
      Type objectType = o.GetType(); 
      if (this.DisplayMember.CompareTo("") == 0) 
      { 
       toCheck = o.ToString(); 

      } 
      else 
      { 
       pinfo = objectType.GetProperty(this.DisplayMember); 
       toCheck = pinfo.GetValue(o, null).ToString(); 

      } 
      if (TextRenderer.MeasureText(toCheck, this.Font).Width > widestStringInPixels) 
       widestStringInPixels = TextRenderer.MeasureText(toCheck, this.Font).Width; 
     } 
     this.DropDownWidth = widestStringInPixels + 15; 
    } 
} 
+0

Gracias. Elegí modificar la propiedad DropDownWidth en el evento DropDown. –

+0

Podría ser una mejor idea suscribirse para los eventos 'DataSourceChanged',' ValueMemberChanged' y 'DisplayMemberChanged' en lugar de ocultar la propiedad. –

+0

Como es una anulación de clase, la manera más limpia es simplemente agregar una anulación para 'OnDropDown' para agregar la llamada allí antes de ejecutar' base.OnDropDown (e) '. Y por cierto, para esa comprobación final de 'if>', simplemente almacene ese ancho en una variable en lugar de llamar ese cálculo dos veces. – Nyerguds

-1

No lo sé, aunque algunos navegadores son lo suficientemente inteligentes como para ampliar el ancho del menú desplegable más allá del cuadro si es necesario. Sé que Firefox y Chrome pueden hacerlo si puedes controlar un poco tu base de usuarios.

Si realmente está desesperado ¿qué tal un cuadro combinado basado en flash que devuelve datos a html?

+0

Estaba buscando una respuesta de winforms. Debo agregar winforms a la pregunta. Perdón por la confusion. –

+0

La mayoría de los navegadores hacen esto automáticamente de todos modos ... – Nyerguds

3

Esta es una solución muy elegante:

private void AdjustWidthComboBox_DropDown(object sender, System.EventArgs e) 
{ 
    ComboBox senderComboBox = (ComboBox)sender; 
    int width = senderComboBox.DropDownWidth; 
    Graphics g = senderComboBox.CreateGraphics(); 
    Font font = senderComboBox.Font; 
    int vertScrollBarWidth = 
     (senderComboBox.Items.Count>senderComboBox.MaxDropDownItems) 
     ?SystemInformation.VerticalScrollBarWidth:0; 

    int newWidth; 
    foreach (string s in ((ComboBox)sender).Items) 
    { 
     newWidth = (int) g.MeasureString(s, font).Width 
      + vertScrollBarWidth; 
     if (width < newWidth) 
     { 
      width = newWidth; 
     } 
    } 
    senderComboBox.DropDownWidth = width; 
} 

Ajuste cuadro combinado desplegable ancho de la lista de ancho de cadena más largahttp://www.codeproject.com/KB/combobox/ComboBoxAutoWidth.aspx

Fuente: Calculating ComboBox DropDownWidth in C#

Cuestiones relacionadas