How to make the ComboBox drop down list resize itself to fit the largest item?
-
10-10-2019 - |
Pergunta
I've got a DataGridView
with a ComboBox
in it that might contain some pretty large strings. Is there a way to have the drop down list expand itself or at least wordwrap the strings so the user can see the whole string without me having to resize the ComboBox
column width?
Solução
Here's what I did to solve this, works great...
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;
}
}
Outras dicas
This is very elegant solution:
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;
}
Adjust combo box drop down list width to longest string width http://www.codeproject.com/KB/combobox/ComboBoxAutoWidth.aspx
Not that I know of, although some browsers are smart enough to expand the width of the drop down menu beyond that of the box if it is needed. I know Firefox and Chrome can do it if you're able to control your user base a little.
If you really are desperate how about a flash based combo box posting data back to html?