如何找到组合框需要显示所有列表项的空间

时间:2009-07-23 15:21:25

标签: .net winforms layout

我有一个WinForms组合框,我希望设置列框的宽度,以便可以完整显示任何选定的项目。 (我不知道在编写软件时组合框中会有哪些项目)

但是,当我调用Combobox.PreferredSize时,它似乎没有考虑下拉列表中的项目。

2 个答案:

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