[C#] ComboBox內容的自動寬度



Answers

這是非常優雅的解決方案。 只需將您的組合框訂閱到此事件處理程序:

 private void AdjustWidthComboBox_DropDown(object sender, EventArgs e)
        {
            var 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;

            var itemsList = senderComboBox.Items.Cast<object>().Select(item => item.ToString());

            foreach (string s in itemsList)
            {
                int newWidth = (int)g.MeasureString(s, font).Width + vertScrollBarWidth;

                if (width < newWidth)
                {
                    width = newWidth;
                }
            }

            senderComboBox.DropDownWidth = width;
        }

此代碼取自codeproject: 調整組合框下拉列表寬度到最長字符串寬度 。 但我已將其修改為使用填充了任何數據(不僅僅是字符串)的組合框。

Question

有沒有人知道將ComboBox的內容寬度設置為自動調整大小的方法

我不是指ComboBox本身,只是打開的內容。




在下面投票給algreat的答案。

我只是修改了algreat的答案,代碼調整了整個控件的大小。

我本來只是將其添加為註釋,但無法在註釋中添加格式化代碼。

private void combo_DropDown(object sender, EventArgs e)
{
    //http://www.codeproject.com/Articles/5801/Adjust-combo-box-drop-down-list-width-to-longest-s
    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;
        }
          if (senderComboBox.Width < newWidth)
          {
              senderComboBox.Width = newWidth+ SystemInformation.VerticalScrollBarWidth;
          }
    }
    senderComboBox.DropDownWidth = width;
}



大部分代碼與Javed Akram的第二個建議相同,但添加了垂直滾動條的寬度:

int setWidth_comboBox(ComboBox cb)
{
  int maxWidth = 0, temp = 0;
  foreach (string s in cb.Items)
  {
    temp = TextRenderer.MeasureText(s, cb.Font).Width;
    if (temp > maxWidth)
    {
      maxWidth = temp;
    }
  }
  return maxWidth + SystemInformation.VerticalScrollBarWidth;
}

使用這樣的代碼(在帶有名為myComboBox的組合框的表單上):

myComboBox.Width = setWidth_comboBox(myComboBox);



Links