webentwicklung-frage-antwort-db.com.de

Auto-Breite des Inhalts der ComboBox

Kennt jemand eine Möglichkeit, die Breite des ComboBox-Objekts auf die automatische Größeneinstellung einzustellen

Ich meine nicht die ComboBox selbst, sondern nur den geöffneten Inhalt.

37
unicorn

Sie können es nicht direkt verwenden. 

Mach einen Trick

Durchlaufen Sie zunächst alle Elemente Ihrer Combobox, überprüfen Sie die Breite aller Elemente, indem Sie den Text einem Etikett zuweisen. Überprüfen Sie dann die Breite jedes Mal, wenn die Breite des aktuellen Elements größer als die vorherigen Elemente ist, und ändern Sie dann die maximale Breite.

int DropDownWidth(ComboBox myCombo)
{
    int maxWidth = 0;
    int temp = 0;
    Label label1 = new Label();

    foreach (var obj in myCombo.Items)
    {
        label1.Text = obj.ToString();
        temp = label1.PreferredWidth;
        if (temp > maxWidth)
        {
            maxWidth = temp;
        }
    }
    label1.Dispose();
    return maxWidth;           
}

private void Form1_Load(object sender, EventArgs e)
{
    comboBox1.DropDownWidth = DropDownWidth(comboBox1);
}

ODER 

Wie von stakx vorgeschlagen, können Sie die Klasse TextRenderer verwenden

int DropDownWidth(ComboBox myCombo)
{
    int maxWidth = 0, temp = 0;
    foreach (var obj in myCombo.Items)
    {
        temp = TextRenderer.MeasureText(obj.ToString(), myCombo.Font).Width;
        if (temp > maxWidth)
        {
            maxWidth = temp;
        }
    }
    return maxWidth;
}
60
Javed Akram

Hier ist eine sehr elegante Lösung. Abonnieren Sie einfach Ihre Combobox für diesen Event-Handler:

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

Dieser Code wurde aus dem Codeprojekt übernommen: Passen Sie die Dropdown-Listenbreite des Kombinationsfelds an die längste Stringbreite an ..__ Ich habe es jedoch geändert, um mit Kombinationsfeldern zu arbeiten, die mit beliebigen Daten gefüllt sind (nicht nur mit Strings).

14
algreat

obj.ToString () funktioniert nicht für mich, ich empfehle daher myCombo.GetItemText (obj). Das funktioniert für mich:

private int DropDownWidth(ComboBox myCombo)
{
    int maxWidth = 0, temp = 0;
    foreach (var obj in myCombo.Items)
    {
        temp = TextRenderer.MeasureText(myCombo.GetItemText(obj), myCombo.Font).Width;
        if (temp > maxWidth)
        {
            maxWidth = temp;
        }
    }
    return maxWidth + SystemInformation.VerticalScrollBarWidth;
}
11
user2361362

Meistens derselbe Code wie in Javed Akrams zweitem Vorschlag, aber die Breite der vertikalen Bildlaufleiste wird hinzugefügt:

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

Verwenden Sie den Code wie folgt (in einem Formular mit einer Combobox mit dem Namen myComboBox):

myComboBox.Width = setWidth_comboBox(myComboBox);
1
matsolof

Dies ist eine alte Frage, aber ich bin nur darauf gestoßen und habe ein paar Antworten für meine Lösung kombiniert. Ich mochte die Einfachheit der akzeptierten Antwort, wollte aber etwas, das mit jedem Objekttyp im Kombinationsfeld funktioniert. Ich wollte die Methode auch durch eine Erweiterungsmethode nutzen.

    public static int AutoDropDownWidth(this ComboBox myCombo)
    {
        return AutoDropDownWidth<object>(myCombo, o => o.ToString());
    }
    public static int AutoDropDownWidth<T>(this ComboBox myCombo, Func<T, string> description)
    {
        int maxWidth = 1;
        int temp = 1;
        int vertScrollBarWidth = (myCombo.Items.Count > myCombo.MaxDropDownItems)
                ? SystemInformation.VerticalScrollBarWidth : 0;

        foreach (T obj in myCombo.Items)
        {
            if (obj is T)
            {
                T t = (T)obj;
                temp = TextRenderer.MeasureText(description(t), myCombo.Font).Width;
                if (temp > maxWidth)
                {
                    maxWidth = temp;
                }
            }

        }
        return maxWidth + vertScrollBarWidth;
    }

Auf diese Weise, wenn meine Klasse:

public class Person
{
    public string FullName {get;set;}
}

Ich könnte die Dropdown-Breite des Kombinationsfelds automatisch wie folgt anpassen:

cbPeople.DropDownWidth = cbPeople.AutoDropDownWidth<Person>(p => p.FullName);
0
Aaron Schooley

Alt, aber klassisch, hoffe, schnell genug zu arbeiten

private int GetDropDownWidth(ComboBox combo)
{
    object[] items = new object[combo.Items.Count];
    combo.Items.CopyTo(items, 0);
    return items.Select(obj => TextRenderer.MeasureText(combo.GetItemText(obj), combo.Font).Width).Max();
}
0
user1779049

Wähle die Antwort von algreat unten. 

Ich habe einfach die Antwort von algreat mit Code geändert, um die gesamte Kontrolle zu ändern.

Ich hätte es nur als Kommentar hinzugefügt, konnte jedoch keinen formatierten Code zum Kommentar hinzufügen.

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;
}
0
Gary Kindel