2010-03-31 15 views
29

Ich versuche, die Hintergrundfarbe einiger Zeilen in einem ListBox zu ändern. Ich habe zwei Listen, dass man Namen hat und in einem ListBox angezeigt wird. Die zweite Liste hat einige ähnliche Werte wie die erste List. Wenn ich auf eine Schaltfläche klicke, suche ich die ListBox und die zweite List, und ändern Sie die Farbe der ListBox für die Werte, die in List erscheinen. Meine Suche im ListBox ist wie folgt:C#: Listbox Zeilenfarbe ändern?

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())) 
     { 
     } 
    } 
} 

Aber ich weiß nicht, welche Methode zu verwenden, um das Aussehen einer ListBox Zeile zu ändern. Kann mir jemand helfen?

** EDIT: **

HALLO schrieb ich meinen Code wie folgt:

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

Jetzt zieht es meine List im ListBox, aber wenn ich auf die Schaltfläche klicken Sie zuerst auf, es zeigt in rot nur die Studenten, die in der List sind und wenn ich auf die ListBox klicke, zieht es alle Elemente an. Ich möchte, dass es alle Elemente zeigt, und wenn ich auf die Schaltfläche klicke, werden alle Elemente und das Element in List rot angezeigt. Wo ist mein Fehler?

+1

Zeichnen Sie es selbst mit OwnerDraw: http://www.c-sharpcorner.com/UploadFile/sahuja/OwnerDrawListBox11212005014826AM/OwnerDrawListBox.aspx –

+1

möglich Duplikat http://stackoverflow.com/questions/1243870/changing- selected-itms-color-in-a-listbox –

+0

Nach deinem Update: anscheinend bekommst du nicht das, was dir die vorherigen Beantworter unten gezeigt haben. Die DrawItem-Methode _erzeugt ein Element_, nicht mehrere Elemente. Sie müssen _jedes Element nach Bedarf behandeln _ und ** nicht ** eine For-Schleife verwenden, um alle Elemente zu verarbeiten. Werfen Sie einen Blick auf Thomas Levesques oder Justins Antwort für gute Beispiele. –

Antwort

20

Ich finde Lösung, dass statt ListBox ich ListView.It verwendet, um Listenelemente BackColor zu ändern.

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

Ich denke, Sie müssen die Listenelemente selbst zeichnen, um dies zu erreichen.

Here's a post mit der gleichen Art von Frage.

20

Sie müssen das Objekt selbst zeichnen. Ändern Sie den DrawMode in OwnerDrawFixed und behandeln Sie das DrawItem-Ereignis.

+0

danke für den Kommentar, aber wie werde ich Verwenden Sie diese Funktion? oder wo? Ich habe die Eigenschaften der Listbox in Drawmode = OwnerDrawFixed geändert und in InitializeComponent() muss ich etwas korrigieren? oder einfach werde ich diese Funktion meiner Form1.cs Funktion hinzufügen und es wird es anrufen? – Ercan

+1

Ich bin ein VS-Designer-Fan. Also im Formular-Editor, wo Ihre Listbox in die Event-Liste gehen und einen neuen Handler für das DrawItem-Event erstellen. Verwenden Sie dann den obigen Code in Ihrem neuen Ereignishandler. – Justin

+0

So verwenden Sie den Zeichen-Handler: listBox1.DrawMode = DrawMode.OwnerDrawFixed; listBox1.DrawItem + = new DrawItemEventHandler (listBox1_DrawItem); – Harrichael

11

Erster Einsatz dieser Namensraum:

using System.Drawing; 

diese überall auf dem Formular hinzufügen:

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

Hier ist der Event-Handler:

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

Wie wäre es

 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

Es ist offensichtlich, dass Sie diesen Code nie ausprobiert haben. Es funktioniert nicht. Es kompiliert nicht einmal. Es scheint, dass Sie ein Java-Programmierer sind. In Java ist es so gemacht. Aber C# ist VOLLSTÄNDIG anders. – Elmue

+0

Warum haben Sie erwartet, dass es kompiliert? es ist Metacode. Nun, ich habe Code nur für ca. 50 Jahre entworfen und geschrieben :) Offensichtlich würde ich dich nicht einstellen, wenn alles, was du tun kannst, ist, nach Copy/Paste Antworten zu suchen. –

+2

Dieser Code ist kompletter Mist. Sie können ein Label nicht in ein Listenfeld einfügen. Es zeigt, dass Sie C# nicht programmieren gelernt haben, nicht einmal innerhalb von 50 Jahren. – Elmue