12

我有一个DataGridView带有 aComboBox的内容,其中可能包含一些相当大的字符串。有没有办法让下拉列表自行扩展或至少对字符串进行自动换行,这样用户就可以看到整个字符串,而无需我调整ComboBox列宽的大小?

4

3 回答 3

10

这是非常优雅的解决方案:

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 senderComboBox.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

Source: Calculating ComboBox DropDownWidth in C#

于 2012-07-19T16:11:16.153 回答
8

这是我为解决这个问题所做的,效果很好......

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;
    }
}
于 2011-01-26T22:51:26.190 回答
-3

据我所知,尽管有些浏览器足够聪明,可以在需要时将下拉菜单的宽度扩展到框的宽度之外。我知道如果您能够稍微控制您的用户群,Firefox 和 Chrome 可以做到这一点。

如果您真的很绝望,那么基于 Flash 的组合框将数据发送回 html 怎么样?

于 2011-01-14T00:16:56.330 回答