2010-03-31 10 views
29

मैं ListBox में कुछ पंक्तियों के पृष्ठभूमि रंग को बदलने की कोशिश कर रहा हूं। मेरे पास दो सूचियां हैं जिनके नाम हैं और ListBox में प्रदर्शित होते हैं। दूसरी सूची में कुछ समान मान हैं जैसे पहले List। एक बटन पर क्लिक करते समय, मैं और दूसरा List खोजना चाहता हूं, और में दिखाई देने वाले मानों के लिए ListBox का रंग बदलना चाहता हूं।सी #: बदलती सूची बॉक्स पंक्ति रंग?

for (int i = 0; i < listBox1.Items.Count; i++) 
{ 
    for (int j = 0; j < students.Count; j++) 
    { 
     if (listBox1.Items[i].ToString().Contains(students[j].ToString())) 
     { 
     } 
    } 
} 

लेकिन मैं जो विधि के लिए एक ListBox पंक्ति के स्वरूप बदलने के लिए में उपयोग करने के लिए पता नहीं है: ListBox में मेरे खोज इस प्रकार है। कोई भी मेरी मदद कर सकता हैं?

** संपादित करें:

private void ListBox1_DrawItem(object sender, DrawItemEventArgs e) 
{ 
    e.DrawBackground(); 
    Graphics g = e.Graphics; 
    Brush myBrush = Brushes.Black; 
    Brush myBrush2 = Brushes.Red; 
    g.FillRectangle(new SolidBrush(Color.Silver), e.Bounds); 
    e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), e.Font, myBrush, e.Bounds, StringFormat.GenericDefault); 
    for (int i = 0; i < listBox1.Items.Count; i++) 
    { 
     for (int j = 0; j < existingStudents.Count; j++) 
     { 
      if (listBox1.Items[i].ToString().Contains(existingStudents[j])) 
      { 
       e.Graphics.DrawString(listBox1.Items[i].ToString(), 
       e.Font, myBrush2, e.Bounds, StringFormat.GenericDefault); 
      } 
     } 
    } 
    e.DrawFocusRectangle(); 
} 

अब यह मेरी ListBox में List खींचता है, लेकिन जब मैं बटन पहले क्लिक करें, यह लाल रंग में दिखाया गया है: **

HI मैं अपने कोड इस प्रकार लिखा था केवल List में छात्र हैं और जब मैं ListBox पर क्लिक करता हूं तो यह सभी तत्वों को खींचता है। मैं चाहता हूं कि यह सभी तत्व दिखाएगा, और जब मैं बटन पर क्लिक करता हूं तो यह सभी तत्वों और तत्व को List में लाल रंग में दिखाएगा। मेरी गलती कहां है?

+1

यह अपने आप को ड्रा OwnerDraw का उपयोग कर: http://www.c-sharpcorner.com/UploadFile/sahuja/OwnerDrawListBox11212005014826AM/OwnerDrawListBox.aspx –

+1

http://stackoverflow.com/questions/1243870/changing- के संभावित डुप्लिकेट चयनित-itms-color-in-a-listbox –

+0

आपके अपडेट के बाद: जाहिर है कि आप नीचे दिए गए पिछले उत्तरदाताओं को नहीं दिखा रहे हैं। DrawItem विधि _ एक आइटम_ हटाता है, एकाधिक आइटम नहीं। आपको आवश्यक आइटम के रूप में _Each आइटम को संभालने की आवश्यकता होगी, और ** ** ** _all_ आइटम्स को संसाधित करने के लिए लूप के लिए उपयोग नहीं करें। अच्छे उदाहरणों के लिए थॉमस लेवेस्क या जस्टिन के जवाब पर एक नज़र डालें। –

उत्तर

20

मैं समाधान है कि बजाय ListBox का उपयोग कर के मैं ListView.It सूची आइटम BackColor बदलने की अनुमति देता इस्तेमाल किया पाते हैं।

private void listView1_Refresh() 
{ 
    for (int i = 0; i < listView1.Items.Count; i++) 
    { 
     listView1.Items[i].BackColor = Color.Red; 
     for (int j = 0; j < existingStudents.Count; j++) 
     { 
      if (listView1.Items[i].ToString().Contains(existingStudents[j])) 
      { 
       listView1.Items[i].BackColor = Color.Green; 
      } 
     } 
    } 
} 
2

मुझे लगता है कि आपको इसे प्राप्त करने के लिए खुद को सूची बनाने के लिए आकर्षित करना होगा।

Here's a post उसी तरह के प्रश्न के साथ।

20

आपको आइटम को स्वयं आकर्षित करने की आवश्यकता होगी। DrawMode को स्वामी DrawFixed में बदलें और DrawItem ईवेंट को संभालें।

/// <summary> 
/// Handles the DrawItem event of the listBox1 control. 
/// </summary> 
/// <param name="sender">The source of the event.</param> 
/// <param name="e">The <see cref="System.Windows.Forms.DrawItemEventArgs"/> instance containing the event data.</param> 
private void listBox1_DrawItem(object sender, DrawItemEventArgs e) 
{ 
    e.DrawBackground(); 
    Graphics g = e.Graphics; 

    // draw the background color you want 
    // mine is set to olive, change it to whatever you want 
    g.FillRectangle(new SolidBrush(Color.Olive), e.Bounds); 

    // draw the text of the list item, not doing this will only show 
    // the background color 
    // you will need to get the text of item to display 
    g.DrawString(THE_LIST_ITEM_TEXT , e.Font, new SolidBrush(e.ForeColor), new PointF(e.Bounds.X, e.Bounds.Y)); 

    e.DrawFocusRectangle(); 
} 
+0

टिप्पणी के लिए धन्यवाद लेकिन मैं कैसे इस समारोह का उपयोग करें? या कहां? मैं सूची बॉक्स के गुणों में Drawmode = OwnerCrawFixed और InitializeComponent() में बदल गया हूं, मुझे कुछ सोचने के लिए सही करना है? या बस मैं इस फॉर्म को अपने फॉर्म 1.cs फ़ंक्शन में जोड़ दूंगा और यह इसे कॉल करेगा? – Ercan

+1

मैं एक वीएस डिजाइनर प्रशंसक हूं। तो फॉर्म संपादक में जहां आपका लिस्टबॉक्स ईवेंट सूची में जाता है और DrawItem ईवेंट के लिए एक नया हैंडलर बनाता है। फिर अपने नए ईवेंट हैंडलर में उपरोक्त कोड का उपयोग करें। – Justin

+0

ड्रॉ आइटम हैंडलर का उपयोग करने के लिए: listBox1.DrawMode = DrawMode.OwnerDrawFixed; सूचीबॉक्स 1। ड्रायटिम + = नया ड्राइटेमइवेंट हैंडलर (listBox1_DrawItem); – Harrichael

11

सबसे पहले उपयोग इस नाम स्थान:

using System.Drawing; 

अपने फार्म पर इस कहीं भी जोड़ें:

listBox.DrawMode = DrawMode.OwnerDrawFixed; 
listBox.DrawItem += listBox_DrawItem; 

यहाँ इवेंट हैंडलर है:

private void listBox_DrawItem(object sender, DrawItemEventArgs e) 
{ 
    e.DrawBackground(); 

    Graphics g = e.Graphics; 
    g.FillRectangle(new SolidBrush(Color.White), e.Bounds); 
    ListBox lb = (ListBox)sender; 
    g.DrawString(lb.Items[e.Index].ToString(), e.Font, new SolidBrush(Color.Black), new PointF(e.Bounds.X, e.Bounds.Y)); 

    e.DrawFocusRectangle(); 
} 
-2

कैसे के बारे में

 MyLB is a listbox 

     Label ll = new Label(); 
     ll.Width = MyLB.Width; 
     ll.Content = ss; 
     if(///<some condition>///) 
      ll.Background = Brushes.LightGreen; 
     else 
      ll.Background = Brushes.LightPink; 
     MyLB.Items.Add(ll); 
+2

यह स्पष्ट है कि आपने कभी भी उस कोड को आजमाया नहीं है। यह काम नहीं करता। यह संकलन भी नहीं करता है। ऐसा लगता है कि आप जावा प्रोग्रामर हैं। जावा में यह इस तरह से किया जाता है। लेकिन सी # पूरी तरह से अलग है। – Elmue

+0

आपने इसे संकलित करने की अपेक्षा क्यों की? यह मेटा कोड है। ठीक है, मैं केवल 50 वर्षों के लिए कोड लिख रहा हूं और लिख रहा हूं :) स्पष्ट रूप से मैं आपको किराए पर नहीं लेता यदि आप जो कुछ भी कर सकते हैं वह कॉपी/पेस्ट उत्तरों की तलाश में है। –

+2

यह कोड पूरा बकवास है। आप एक लेबलबॉक्स में लेबल नहीं डाल सकते हैं। यह दिखाता है कि आपने 50 वर्षों के भीतर भी प्रोग्रामिंग सी # नहीं सीखा। – Elmue

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