2009-11-24 10 views

उत्तर

7

कस्टम ड्राइंग के साथ अपने स्वयं ComboBox बनाने के साथ आप इस जिन्हें आप मैन्युअल DrawItem घटना का उपयोग कर आइटम आकर्षित करने के लिए अनुमति देता है DrawModeOwnerDrawFixed को निर्धारित करके कर सकते हैं।

comboBox1.DrawMode = DrawMode.OwnerDrawFixed; 
comboBox1.DrawItem += new DrawItemEventHandler(comboBox1_DrawItem); 

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e) {  
    Font font = comboBox1.Font; 
    Brush brush = Brushes.Black; 
    string text = comboBox1.Items[e.Index]; 

    if (you want bold) 
     font = new Font(font, FontStyle.Bold); 

    if (you want green) 
     brush = Brushes.Green; 

    e.Graphics.DrawString(text, font, brush, e.Bounds); 
} 
0

नहीं, ऐसा करने के लिए कोई अंतर्निहित संपत्ति नहीं है। आपको अपना नियंत्रण बनाना होगा और प्रतिपादन को ओवरराइड करना होगा।

11

इस पोस्ट के रूप में पुराना है, मैंने इसे खोजने के लिए शुरुआती बिंदु के रूप में उपयोगी पाया लेकिन @Paul द्वारा here दिखाए गए तरीके का उपयोग करके बेहतर परिणाम प्राप्त कर लिया।

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

private void ComboBox1_DrawItem(object sender, DrawItemEventArgs e) 
     { 
      if (e.Index == -1) 
       return; 
      ComboBox combo = ((ComboBox)sender); 
      using (SolidBrush brush = new SolidBrush(e.ForeColor)) 
      { 
       Font font = e.Font; 
       if (/*Condition Specifying That Text Must Be Bold*/) 
        font = new System.Drawing.Font(font, FontStyle.Bold); 
       e.DrawBackground(); 
       e.Graphics.DrawString(combo.Items[e.Index].ToString(), font, brush, e.Bounds); 
       e.DrawFocusRectangle(); 
      } 

     } 
2

बस जवाब दान द्वारा आपूर्ति में जोड़ने के लिए, मत भूलना कि तुम सिर्फ सादा तार के साथ कोई ComboBox की तुलना में एक डेटा स्रोत के लिए सूची, बाध्य किया है बल्कि , आप combo.Items[e.Index].ToString() का उपयोग कर प्रविष्टि को फिर से नहीं ले पाएंगे।

उदाहरण के लिए, आपने कॉम्बोबॉक्स को डेटाटेबल में बाध्य कर दिया है, और दान के उत्तर में कोड का उपयोग करने का प्रयास करें, तो आप केवल System.Data.DataRowView युक्त कॉम्बोबॉक्स के साथ समाप्त हो जाएंगे, क्योंकि सूची में प्रत्येक आइटम एक नहीं है स्ट्रिंग, यह DataRowView है।

इस मामले में कोड निम्नलिखित की तरह कुछ होगा:

private void ComboBox1_DrawItem(object sender, DrawItemEventArgs e) 
      { 
       if (e.Index == -1) 
        return; 
       ComboBox combo = ((ComboBox)sender); 

       using (SolidBrush brush = new SolidBrush(e.ForeColor)) 
       { 
        Font font = e.Font; 
        DataRowView item = (DataRowView)combo.Items[e.Index]; 

        if (/*Condition Specifying That Text Must Be Bold*/) { 
         font = new System.Drawing.Font(font, FontStyle.Bold); 
        } 
        else { 
         font = new System.Drawing.Font(font, FontStyle.Regular); 
        }      

        e.DrawBackground(); 
        e.Graphics.DrawString(item.Row.Field<String>("DisplayMember"), font, brush, e.Bounds); 
        e.DrawFocusRectangle(); 
       } 

      } 

कहाँ "DisplayMember" फ़ील्ड का नाम सूची (ComboBox1.DisplayMember संपत्ति में सेट) में प्रदर्शित किया जा रहा है।

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