2010-12-15 6 views

Antwort

6

Hier ist, was ich dieses Problem zu lösen hat, funktioniert super ...

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

Danke. Ich habe die DropDownWidth-Eigenschaft im DropDown-Ereignis geändert. –

+0

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

+0

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

-1

Nicht, dass ich weiß, obwohl einige Browser schlau genug sind, die Breite des Dropdown-Menüs über das der Box hinaus zu erweitern, wenn es benötigt wird. Ich weiß, Firefox und Chrome können es tun, wenn Sie in der Lage sind, Ihre Benutzerbasis ein wenig zu kontrollieren.

Wenn Sie wirklich verzweifelt sind, wie wäre es mit einer Flash-basierten Combo-Box, die Daten zurück zu HTML schreibt?

+0

War auf der Suche nach einer Winforms-Antwort. Ich sollte winforms zur Frage hinzufügen. Entschuldigung für die Verwirrung. –

+0

Die meisten Browser tun dies automatisch ... – Nyerguds

3

Diese sehr elegante Lösung ist:

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 ((ComboBox)sender).Items) 
    { 
     newWidth = (int) g.MeasureString(s, font).Width 
      + vertScrollBarWidth; 
     if (width < newWidth) 
     { 
      width = newWidth; 
     } 
    } 
    senderComboBox.DropDownWidth = width; 
} 

Passen Kombinationsfeld Dropdown-Liste Breite längste Zeichenfolge Breitehttp://www.codeproject.com/KB/combobox/ComboBoxAutoWidth.aspx

Quelle: Calculating ComboBox DropDownWidth in C#