Ich habe eine DataGridView
mit einer ComboBox
drin, die einige ziemlich große Zeichenfolgen enthalten könnte. Gibt es eine Möglichkeit, die Dropdown-Liste selbst zu erweitern oder zumindest die Strings wordwrap, so dass der Benutzer die gesamte Zeichenfolge sehen kann, ohne dass ich die Spaltenbreite ComboBox
ändern muss?Wie die ComboBox Drop-Down-Liste Größe anpassen, um das größte Element passen?
Antwort
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;
}
}
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?
War auf der Suche nach einer Winforms-Antwort. Ich sollte winforms zur Frage hinzufügen. Entschuldigung für die Verwirrung. –
Die meisten Browser tun dies automatisch ... – Nyerguds
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
Danke. Ich habe die DropDownWidth-Eigenschaft im DropDown-Ereignis geändert. –
Es könnte eine bessere Idee sein, für die Ereignisse "DataSourceChanged", "ValueMemberChanged" und "DisplayMemberChanged" zu subskribieren anstatt die Eigenschaften zu verstecken. –
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