Cómo hacer que la caída de la lista desplegable ComboBox propio cambio de tamaño para adaptarse a la mayor partida?

StackOverflow https://stackoverflow.com/questions/4448509

Pregunta

Tengo un DataGridView con un ComboBox en ella que podrían contener algunas cadenas muy grandes. ¿Hay una manera de tener la lista desplegable expandirse o al menos wordwrap las cuerdas de modo que el usuario puede ver la cadena completa sin tener que cambiar el ancho de columna ComboBox?

¿Fue útil?

Solución

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

Otros consejos

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 combinado cuadro desplegable ancho de la lista de cadena más larga de anchura http://www.codeproject.com/KB/combobox/ComboBoxAutoWidth.aspx

Fuente: Cálculo ComboBox dropdownWidth en C #

No, que yo sepa, aunque algunos navegadores son lo suficientemente inteligente como para ampliar el ancho del menú más allá de la caja si es necesario hacia abajo. Sé que Firefox y Chrome puede hacerlo si usted es capaz de controlar su base de usuarios un poco.

Si realmente está desesperado ¿qué tal un cuadro combinado basado en flash back datos de contabilización de html?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top