ToolStripComboBox Drop Down Sizing

This last night I worked on a bug where I had a ToolStripComboBox in a Visual Studio custom tool window that holds a list of files but would cut off the filenames in the dropdown list if the paths became too long.

Easy enough to fix, or so I thought.  After trying out about all of the property setting combinations I could think of, I never could get the control to automatically size the dropdown list width to accommodate the widest item currently in the list.  This is sort of ridiculous, in my opinion, but I could not find a way to do this without writing some code to do it.

Here is the code that I wrote so hopefully someone will save some time by seeing this and not spend their Friday night on search engines and MSDN attempting to find a way to accomplish the goal:

[sourcecode language=’csharp’]
int i = cboFile.Items.Add(file);
//make sure dropdownlist width is sized correctly
Graphics g = cboFile.ComboBox.CreateGraphics();
SizeF size = g.MeasureString(file, new Font(cboFile.Font.FontFamily.Name, cboFile.Font.Size));
// Set the DropDownWidth if the item has a greater width
int itemWidth = (int)size.Width + 10; //add a little empty space
if (itemWidth > cboFile.DropDownWidth)
{
cboFile.DropDownWidth = itemWidth;
}
[/sourcecode]

You can ignore the definition of "i", I was using that later in the code to do some processing specific to my extension.  It is possible that there is an easier way to do this, but I couldn’t find one.

Tags: ,

Comments

One Response to “ToolStripComboBox Drop Down Sizing”

  1. Tim on November 19th, 2013 8:45 am

    Thanks for this code – saved me a bunch of time.

    One comment, you should really dispose the Graphics handle that you are creating. Or better yet, do:

    using(Graphics g = new cboFile.ComboBox.CreateGraphics())
    {

    }

    Also, error/null checking if you can’t guarantee everything will be initialized.