Ancho automático del contenido de ComboBox

¿Alguien sabe una manera de configurar el ancho del contenido de ComboBox a tamaño automático?

No me refiero al ComboBox sí, solo al contenido abierto.

No puedes usarlo directamente.

Hacer un truco

En primer lugar, repase todos los elementos de su cuadro combinado, verifique el ancho de cada elemento asignando el texto a una etiqueta. Luego, verifique el ancho cada vez, si el ancho del elemento actual es mayor que el de los elementos anteriores, cambie el ancho máximo.

 int DropDownWidth(ComboBox myCombo) { int maxWidth = 0; int temp = 0; Label label1 = new Label(); foreach (var obj in myCombo.Items) { label1.Text = obj.ToString(); temp = label1.PreferredWidth; if (temp > maxWidth) { maxWidth = temp; } } label1.Dispose(); return maxWidth; } private void Form1_Load(object sender, EventArgs e) { comboBox1.DropDownWidth = DropDownWidth(comboBox1); } 

O

Según lo sugerido por stakx , puede utilizar la clase TextRenderer

 int DropDownWidth(ComboBox myCombo) { int maxWidth = 0, temp = 0; foreach (var obj in myCombo.Items) { temp = TextRenderer.MeasureText(obj.ToString(), myCombo.Font).Width; if (temp > maxWidth) { maxWidth = temp; } } return maxWidth; } 

Aquí está la solución muy elegante. Solo suscriba su combobox a este controlador de eventos:

  private void AdjustWidthComboBox_DropDown(object sender, EventArgs e) { var 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; var itemsList = senderComboBox.Items.Cast().Select(item => item.ToString()); foreach (string s in itemsList) { int newWidth = (int)g.MeasureString(s, font).Width + vertScrollBarWidth; if (width < newWidth) { width = newWidth; } } senderComboBox.DropDownWidth = width; } 

Este código fue tomado del proyecto de código: Ajustar el ancho de la lista desplegable del cuadro combinado al ancho de cadena más largo . Pero lo he modificado para que funcione con comboboxes llenos de datos (no solo cadenas).

obj.ToString () no funciona para mí, sugiero usar myCombo.GetItemText (obj). Esto funciona para mí:

 private int DropDownWidth(ComboBox myCombo) { int maxWidth = 0, temp = 0; foreach (var obj in myCombo.Items) { temp = TextRenderer.MeasureText(myCombo.GetItemText(obj), myCombo.Font).Width; if (temp > maxWidth) { maxWidth = temp; } } return maxWidth + SystemInformation.VerticalScrollBarWidth; } 

Principalmente el mismo código que en la segunda sugerencia de Javed Akram, pero se agrega el ancho de la barra de desplazamiento vertical:

 int setWidth_comboBox(ComboBox cb) { int maxWidth = 0, temp = 0; foreach (string s in cb.Items) { temp = TextRenderer.MeasureText(s, cb.Font).Width; if (temp > maxWidth) { maxWidth = temp; } } return maxWidth + SystemInformation.VerticalScrollBarWidth; } 

Use el código como este (en un formulario con un cuadro combinado con el nombre myComboBox):

 myComboBox.Width = setWidth_comboBox(myComboBox); 

Esta es una pregunta antigua, pero simplemente la encontré y combiné un par de respuestas para mi solución. Me gustó la simplicidad de la respuesta aceptada, pero quería algo que funcionara con cualquier tipo de objeto en el cuadro combinado. También quise hacer uso del método a través de un método de extensión.

  public static int AutoDropDownWidth(this ComboBox myCombo) { return AutoDropDownWidth(myCombo, o => o.ToString()); } public static int AutoDropDownWidth(this ComboBox myCombo, Func description) { int maxWidth = 1; int temp = 1; int vertScrollBarWidth = (myCombo.Items.Count > myCombo.MaxDropDownItems) ? SystemInformation.VerticalScrollBarWidth : 0; foreach (T obj in myCombo.Items) { if (obj is T) { T t = (T)obj; temp = TextRenderer.MeasureText(description(t), myCombo.Font).Width; if (temp > maxWidth) { maxWidth = temp; } } } return maxWidth + vertScrollBarWidth; } 

De esta manera si mi clase es:

 public class Person { public string FullName {get;set;} } 

Podría ajustar automáticamente el ancho desplegable del cuadro combinado como este:

 cbPeople.DropDownWidth = cbPeople.AutoDropDownWidth(p => p.FullName); 

Viejo pero clásico, espero trabajar lo suficientemente rápido.

 private int GetDropDownWidth(ComboBox combo) { object[] items = new object[combo.Items.Count]; combo.Items.CopyTo(items, 0); return items.Select(obj => TextRenderer.MeasureText(combo.GetItemText(obj), combo.Font).Width).Max(); } 

Vota por la respuesta de algreat abajo.

Simplemente modifiqué la respuesta de algreat con el código redimensionando todo el control.

Lo hubiera agregado como un comentario, pero no pude agregar un código formateado en el comentario.

 private void combo_DropDown(object sender, EventArgs e) { //http://www.codeproject.com/Articles/5801/Adjust-combo-box-drop-down-list-width-to-longest-s 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; } if (senderComboBox.Width < newWidth) { senderComboBox.Width = newWidth+ SystemInformation.VerticalScrollBarWidth; } } senderComboBox.DropDownWidth = width; }