2010-12-15 15 views
8

मुझे DataGridView मिला है जिसमें ComboBox है जिसमें कुछ सुंदर बड़े तार हो सकते हैं। क्या ड्रॉप डाउन सूची स्वयं को विस्तारित करने या कम से कम वर्डव्रैप स्ट्रिंग करने का कोई तरीका है ताकि उपयोगकर्ता ComboBox कॉलम चौड़ाई का आकार बदलने के बिना पूरी स्ट्रिंग देख सके?कॉम्बोबॉक्स ड्रॉप डाउन सूची को कैसे सबसे बड़ा आइटम फिट करने के लिए आकार बदलना है?

उत्तर

6

यहाँ क्या मैं इस को हल करने के लिए किया था है, अच्छा काम करता है ...

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

धन्यवाद। मैंने DropDown ईवेंट में DropDownWidth प्रॉपर्टी को संशोधित करना चुना है। –

+0

संपत्ति छिपाने की बजाय 'डेटासोर्स चेंज', 'ValueMemberChanged' और' DisplayMemberChanged' ईवेंट के लिए सब्सक्राइब करना बेहतर विचार हो सकता है। –

+0

चूंकि यह एक वर्ग ओवरराइड है, इसलिए सबसे अच्छा तरीका है 'बेसडऑनडाउन' (')' निष्पादित करने से पहले कॉल को जोड़ने के लिए 'ऑनड्रॉपडाउन' के लिए ओवरराइड जोड़ना। और बीटीडब्ल्यू, उस अंतिम 'if>' चेक के लिए, उस गणना को दो बार गणना करने के बजाय उस चर को एक चर में संग्रहीत करें। – Nyerguds

-1

ऐसा नहीं है कि मुझे पता है, हालांकि कुछ ब्राउज़र बॉक्स के बाहर ड्रॉप डाउन मेनू की चौड़ाई को विस्तारित करने के लिए पर्याप्त स्मार्ट हैं, यदि इसकी आवश्यकता हो। मुझे फ़ायरफ़ॉक्स पता है और क्रोम यह कर सकता है अगर आप अपने उपयोगकर्ता आधार को थोड़ा नियंत्रित करने में सक्षम हैं।

यदि आप वास्तव में एक फ्लैश आधारित कॉम्बो बॉक्स डेटा को एचटीएमएल पर पोस्ट करने के बारे में हताश हैं?

+0

एक Winforms उत्तर के लिए देख रहा था। मुझे प्रश्न में Winforms जोड़ना चाहिए। गलतफहमी के लिए खेद है। –

+0

अधिकांश ब्राउज़र इसे स्वचालित रूप से करते हैं ... – Nyerguds

3

यह बहुत सुरुचिपूर्ण समाधान है:

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

कॉम्बो बॉक्स समायोजित सूची चौड़ाई ड्रॉप डाउन करने के सबसे लंबे समय तक स्ट्रिंग चौड़ाईhttp://www.codeproject.com/KB/combobox/ComboBoxAutoWidth.aspx

स्रोत: Calculating ComboBox DropDownWidth in C#

संबंधित मुद्दे