2010-12-15 18 views

Odpowiedz

6

Oto co zrobiłem, aby rozwiązać ten problem, działa świetnie ...

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

Dziękuję. Zdecydowałem się zmodyfikować właściwość DropDownWidth w zdarzeniu DropDown. –

+0

Może być lepszym pomysłem, aby subskrybować zdarzenia 'DataSourceChanged',' ValueMemberChanged' i 'DisplayMemberChanged' zamiast ukrywania właściwości. –

+0

Ponieważ jest to nadpisanie klasy, najczystszym sposobem jest dodanie override dla 'OnDropDown', aby dodać wywołanie tam przed wykonaniem' base.OnDropDown (e) '. I przy okazji, dla tego końcowego sprawdzenia 'if>', po prostu zapisz tę szerokość w zmiennej zamiast wywoływać te obliczenia dwa razy. – Nyerguds

-1

Nie to, co wiem, chociaż niektóre przeglądarki są wystarczająco inteligentne, aby zwiększyć szerokość menu rozwijanego poza pole, jeśli jest ono potrzebne. Wiem, że Firefox i Chrome mogą to zrobić, jeśli możesz trochę kontrolować swoją bazę użytkowników.

Jeśli naprawdę jesteś zrozpaczony, to jak w polu kombi opartym na pamięci flash, wysyłając dane z powrotem do html?

+0

Szukał odpowiedzi na pytanie o wygraną. Powinienem dodać winFormy do pytania. Przepraszam za zamieszanie. –

+0

Większość przeglądarek robi to automatycznie i tak ... – Nyerguds

3

Jest to bardzo eleganckie rozwiązanie:

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

Ustaw pole kombi rozwijanej listy szerokość do szerokości najdłuższy łańcuchhttp://www.codeproject.com/KB/combobox/ComboBoxAutoWidth.aspx

Źródło: Calculating ComboBox DropDownWidth in C#

Powiązane problemy