2008-11-29 14 views
13

विजुअल सी # एक्सप्रेस संस्करण में, क्या किसी सूची बॉक्स में कुछ (लेकिन सभी नहीं) आइटम बनाना संभव है? मुझे एपीआई में इसके लिए कोई भी विकल्प नहीं मिल रहा है।मैं लिस्टबॉक्स में कुछ आइटम कैसे बोल्ड कर सकता हूं?

+0

आप WPF पर कर रहे हैं? इस मामले में, यह बहुत आसान है – Gishu

+0

मुझे खेद है कि मैं एक .NET नौसिखिया का थोड़ा सा हूं, मुझे यह भी यकीन नहीं है कि डब्ल्यूपीएफ क्या है। –

उत्तर

30

आपको Listbox के DrawMode को DrawMode.OwnerDrawFixed में बदलने की आवश्यकता है। MSDN पर इन लेखों की जाँच करें:
DrawMode Enumeration
ListBox.DrawItem Event
Graphics.DrawString Method

इसके अलावा MSDN मंचों पर इस सवाल को देखो: (दोनों आइटम
Question on ListBox items

एक साधारण उदाहरण - ब्लैक-एरियल-10-बोल्ड):

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     ListBox1.Items.AddRange(new Object[] { "First Item", "Second Item"}); 
     ListBox1.DrawMode = DrawMode.OwnerDrawFixed; 
    } 

    private void ListBox1_DrawItem(object sender, DrawItemEventArgs e) 
    { 
     e.DrawBackground(); 
     e.Graphics.DrawString(ListBox1.Items[e.Index].ToString(), new Font("Arial", 10, FontStyle.Bold), Brushes.Black, e.Bounds); 
     e.DrawFocusRectangle(); 
    } 
} 
+0

महान उदाहरण और लिंक। इच्छा है कि मैं इसे दो बार वोट दे सकता हूं! –

0

कोड का प्रदर्शन करने के बाद यह कोड है।

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsFormsApplication2 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      foreach (FontFamily fam in FontFamily.Families) 
      { 
       listBox1.Items.Add(fam.Name); 
      } 
      listBox1.DrawMode = DrawMode.OwnerDrawFixed; // 属性里设置 

     } 

     private void listBox1_DrawItem(object sender, DrawItemEventArgs e) 
     { 
      e.DrawBackground(); 
      e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), new Font(listBox1.Items[e.Index].ToString(), listBox1.Font.Size), Brushes.Black, e.Bounds); 
      //e.DrawFocusRectangle(); 
     } 
    } 
} 

Sample Output

1

मिंडोगस Mozūras के समाधान के लिए जोड़ने के लिए, मैं एक समस्या है जहाँ मेरे e.Bounds इतना बड़ा नहीं था और टेक्स्ट कटा हो रही थी। इस समस्या को हल करने के लिए (here पोस्ट के लिए धन्यवाद), आप OnMeasureItem ईवेंट ओवरराइड करते हैं और अपने ड्रामोड को DrawMode.OwnerDrawVariable में बदलते हैं।

डिजाइनर में:

listBox.DrawMode = DrawMode.OwnerDrawVariable; 

हैंडलर में:

void listBox_MeasureItem(object sender, MeasureItemEventArgs e) 
{ 
    e.ItemHeight = 18; 
} 

ऊंचाई टेक्स्ट कटा होने के अपने मुद्दों के हल।

+1

बस यह कहने के लिए कि मुझे अपने विकास कंप्यूटर पर यह समस्या नहीं है, लेकिन टर्मिनल सर्वर पर शिपिंग करते समय हमें यह मिला। तो मैं सुरक्षा के लिए अपने कोड पर इसे लागू करने की दृढ़ता से अनुशंसा करता हूं। – Jonas

0

प्रेषक का उपयोग करने वाला एक और सामान्य उदाहरण, और वास्तव में अग्रभूमि रंग का सम्मान करता है (उदाहरण के लिए, आइटम का चयन किया जाता है, उदाहरण के लिए, या उपयोगकर्ता किसी अन्य रंग सेट का उपयोग करता है, जहां काला अग्रभूमि रंग वास्तव में पठनीय नहीं है) और वर्तमान सूची बॉक्स फ़ॉन्ट:

private void listBoxDrawItem (object sender, DrawItemEventArgs e) 
    { 
     Font f = e.Font; 
     if (e.Index == 1) //TODO: Your condition to make text bold 
      f = new Font(e.Font, FontStyle.Bold); 
     e.DrawBackground(); 
     e.Graphics.DrawString(((ListBox)(sender)).Items[e.Index].ToString(), f, new SolidBrush(e.ForeColor), e.Bounds); 
     e.DrawFocusRectangle(); 
    } 

आपको DrawMode को स्वामी DrawFixed पर सेट करने की आवश्यकता है (उदाहरण के लिए, डिज़ाइनर में)।

0

चयनित आइटम बोल्ड

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     ListBox1.Items.AddRange(new Object[] { "me", "myself", "bob"}); 

     // set the draw mode to fixed 
     ListBox1.DrawMode = DrawMode.OwnerDrawFixed; 
    } 

    private void ListBox1_DrawItem(object sender, DrawItemEventArgs e) 
    { 
     // draw the background 
     e.DrawBackground(); 

     // get the font 
     Font font = new Font(e.Font, (e.State & DrawItemState.Selected) == DrawItemState.Selected ? FontStyle.Bold : FontStyle.Regular); 

     // draw the text 
     e.Graphics.DrawString(ListBox1.Items[e.Index].ToString(), font, new SolidBrush(ListBox1.ForeColor), e.Bounds); 

     e.DrawFocusRectangle(); 
    } 
} 
संबंधित मुद्दे