Подтвердить что ты не робот

Авто-ширина содержимого ComboBox

Кто-нибудь знает способ установить ширину содержимого ComboBox для автосохранения

Я не имею в виду самого ComboBox, только открытый контент.

4b9b3361

Ответ 1

Вы не можете использовать его напрямую.

Сделайте трюк

Сначала перебирайте все элементы вашего списка со списком, проверяйте ширину каждого элемента, назначив текст ярлыку. Затем проверяйте ширину каждый раз, если ширина текущего элемента становится больше, чем предыдущие, а затем меняйте максимальную ширину.

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

ИЛИ

Как предложено stakx, вы можете использовать TextRenderer class

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

Ответ 2

Вот очень изящное решение. Просто подпишите свой combobox для этого обработчика событий:

 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<object>().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;
        }

Этот код был взят из кодекса: Отрегулируйте ширину списка выпадающих списков со списком до самой длинной ширины строки. Но я изменил его для работы с comboboxes, заполненными любыми данными (не только строки).

Ответ 3

obj.ToString() не работает для меня, я предлагаю использовать myCombo.GetItemText(obj). Это работает для меня:

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

Ответ 4

В основном тот же код, что и во втором предложении Javed Akram, но добавляется ширина вертикальной полосы прокрутки:

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

Используйте такой код (в форме со списком с именем myComboBox):

myComboBox.Width = setWidth_comboBox(myComboBox);

Ответ 5

Это старый вопрос, но я просто столкнулся с ним и собрал пару ответов для моего решения. Мне понравилась простота принятого ответа, но хотелось что-то, что будет работать с любым типом объекта в поле со списком. Я также хотел использовать метод с помощью метода расширения.

    public static int AutoDropDownWidth(this ComboBox myCombo)
    {
        return AutoDropDownWidth<object>(myCombo, o => o.ToString());
    }
    public static int AutoDropDownWidth<T>(this ComboBox myCombo, Func<T, string> 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;
    }

Таким образом, если мой класс:

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

Я мог бы автоматически отрегулировать выпадающую ширину поля со списком следующим образом:

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

Ответ 6

Голосовать за альтернативный ответ ниже.

Я просто изменил альтернативный ответ с изменением размера кода контроль.

Я бы просто добавил его в качестве комментария, но не смог добавить форматированный код в комментарий.

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

Ответ 7

Старый, но классический, надеюсь работать достаточно быстро

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