Как сделать так, чтобы выпадающий список ComboBox изменял свой размер, чтобы соответствовать наибольшему элементу? - PullRequest
9 голосов
/ 15 декабря 2010

У меня есть DataGridView с ComboBox, в котором могут быть довольно большие строки.Есть ли способ, чтобы раскрывающийся список расширялся сам или, по крайней мере, переносил строки по словам, чтобы пользователь мог видеть всю строку без необходимости изменять размер столбца ComboBox?

Ответы [ 3 ]

7 голосов
/ 27 января 2011

Вот что я сделал, чтобы решить эту проблему, прекрасно работает ...

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;
    }
}
6 голосов
/ 19 июля 2012

Это очень элегантное решение:

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

Настройка ширины выпадающего списка в поле со списком самой длинной строки http://www.codeproject.com/KB/combobox/ComboBoxAutoWidth.aspx

Источник: РасчетComboBox DropDownWidth в C #

0 голосов
/ 14 января 2011

Не знаю, хотя некоторые браузеры достаточно умны, чтобы расширить ширину выпадающего меню за пределы коробки, если это необходимо. Я знаю, что Firefox и Chrome могут это сделать, если вы можете немного контролировать свою пользовательскую базу.

Если вы действительно в отчаянии, как насчет флеш-поля со списком, отправляющего данные обратно в HTML?

...