12 Stimmen

Wie lässt sich die Dropdown-Liste des ComboBox automatisch an das größte Element anpassen?

Ich habe ein DataGridView mit einem ComboBox, das möglicherweise einige ziemlich große Zeichenfolgen enthält. Gibt es eine Möglichkeit, die Dropdown-Liste zu erweitern oder zumindest die Zeichenfolgen umzubrechen, damit der Benutzer die gesamte Zeichenfolge sehen kann, ohne dass ich die Breite der ComboBox-Spalte ändern muss?

12voto

Nemanja Vujacic Punkte 895

Dies ist eine sehr elegante Lösung:

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

Passe die Breite der Dropdown-Liste des Kombinationsfelds an die Breite des längsten Textes an http://www.codeproject.com/KB/combobox/ComboBoxAutoWidth.aspx

Quelle: Berechnen der ComboBox DropDownWidth in C#

8voto

Isaac Bolinger Punkte 7208

Hier ist, was ich getan habe, um dieses Problem zu lösen, funktioniert großartig...

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

0 Stimmen

Vielen Dank. Ich habe mich entschieden, die DropDownWidth-Eigenschaft im DropDown-Ereignis zu ändern.

0 Stimmen

Es könnte eine bessere Idee sein, sich für die Ereignisse DataSourceChanged, ValueMemberChanged und DisplayMemberChanged anzumelden, anstatt Eigenschaften zu verstecken.

0 Stimmen

Da es sich um eine Klassenüberschreibung handelt, ist der sauberste Weg, einfach ein Override für OnDropDown hinzuzufügen, um den Aufruf dort hinzuzufügen, bevor base.OnDropDown(e) ausgeführt wird. Und übrigens, für die endgültige if > Überprüfung, speichern Sie einfach diese Breite in einer Variablen, anstatt diese Berechnung zweimal aufzurufen.

-3voto

Hawxby Punkte 2717

Nicht dass ich wüsste, obwohl einige Browser intelligent genug sind, um die Breite des Dropdown-Menüs über die des Feldes hinaus zu erweitern, wenn es erforderlich ist. Ich weiß, dass Firefox und Chrome es können, wenn Sie Ihre Benutzerbasis ein wenig kontrollieren können.

Wenn Sie wirklich verzweifelt sind, wie wäre es mit einem Flash-basierten Kombinationsfeld, das Daten zurück an HTML sendet?

0 Stimmen

Suchte nach einer WinForms-Antwort. Ich sollte WinForms zur Frage hinzufügen. Entschuldigung für die Verwirrung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X