Это старый вопрос, но я просто наткнулся на него и объединил пару ответов для своего решения.Мне понравилась простота принятого ответа, но я хотел что-то, что будет работать с любым типом объекта в поле со списком.Я также хотел использовать метод через метод расширения.
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);