我有一个WinForms组合框,我希望设置列框的宽度,以便可以完整显示任何选定的项目。 (我不知道在编写软件时组合框中会有哪些项目)
但是,当我调用Combobox.PreferredSize时,它似乎没有考虑下拉列表中的项目。
答案 0 :(得分:2)
使用System.Drawing.Graphis.MeasureString
或其他(更快)替代TextRenderer.MeasureText
将可以测量给定字体中字符串的宽度。只需获取项目列表中所有项目的最大宽度,并将控件的宽度设置为该最大值。
这样做的算法是:
using (Graphics g = comboBox.CreateGraphics())
{
float maxWidth = comboBox.Width;
foreach(string s in comboBox.Items)
{
SizeF size = g.MeasureString(s, comboBox.Font);
if (size.Width > maxWidth)
maxWidth = size.Width;
}
}
comboBox.Width = maxWidth;
答案 1 :(得分:1)
您可以使用System.Drawing.Graphics.MeasureString
方法。请查看this answer,了解有关如何查找列表中最宽项目的更多详细信息。
private void ResizeComboBox(ComboBox comboBox) {
var maxItemLength = 0;
// using the ComboBox to get a Graphics object:
using (var g = Graphics.FromHwnd(comboBox.Handle)) {
foreach (var item in comboBox.Items.Cast<string>()) {
var itemLength = g.MeasureString(item, comboBox.Font);
maxItemLength = Math.Max((int) itemLength.Width, maxItemLength);
}
}
// correction for the drop down arrow
maxItemLength += 15;
comboBox.Width = maxItemLength;
}