Forum: PC-Programmierung unter visual c# Einträge in einer Listbox einfärben


von RingoStar (Gast)


Lesenswert?

Hallo,

ich suche nach einer Möglichkeit in einer Listbox die Einträge in z.B. 
rot und grün einzufärben.

Bisher habe ich das so versucht:

if()
{
   sResult = "Test  -> OK";
   lbTestResult.ForeColor = Color.Green;
   lbTestResult.Items.Add(sResult);
}
else
{
   sResult = "Test  -> NOK";
   lbTestResult.ForeColor = Color.Red;
   lbTestResult.Items.Add(sResult);
}

Das Problem ist dabei aber, daß alle Einträge eingefärbt werden. ich 
möchte das im Fall "OK" der Eintrag grün ist, im Falle von NOK soll er 
rot sein, und vor allem bleiben

Hat jemand eine Idee? Wenn ja vielen Dank im vorraus!

Gruß
RingoStar

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ownerdraw-Listbox verwenden, OnDraw überladen und dort zu jedem Item die 
(anderswo oder per ItemData) gespeicherte Farbe anwenden.

von RingoStar (Gast)


Lesenswert?

Was bedeutet Ownerdraw-Listbox?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das ist eine Listbox mit dem Fensterstil WS_OWNERDRAW.

von Helmi (Gast)


Lesenswert?

Versuch mal den Link

http://www.codeguru.com/cpp/controls/listbox/colorlistboxes/article.php/c1611/#more

so habe ich auch mal eine Listbox eingefaerbt

Gruss Helmi

von Arc N. (arc)


Lesenswert?

C# war gefragt...

> Was bedeutet Ownerdraw-Listbox?

lbTestResult.DrawMode = DrawMode.OwnerDrawFixed;
Im DrawItem-Handler zuerst den Hintergrund zeichnen lassen 
(e.DrawBackground()), dann den Text passend ausgeben und zum Schluss
noch e.DrawFocusRectangle() aufrufen.

von RingoStar (Gast)


Lesenswert?

Hallo,

so richtig schlau werde ich aus Euren Antworten leider nicht. Wie muss 
ich den DrawItem-Handler einsetzen?
Ich tüftel schon den ganzen Nachmittag, aber es will nicht klappen.

von Arc N. (arc)


Lesenswert?

Im Entwurfsmodus der Form die ListBox anklicken,
Eigenschaften. Unter Eigenschaften den DrawMode auf OwnerDrawFixed 
umstellen,
auf Ereignisse und DrawItem doppelt anklicken.
Den generierten DrawItem-Handler etwa so auffüllen:
1
private void listBox1_DrawItem(object sender, DrawItemEventArgs e) {
2
    // Hintergrund zeichnen lassen
3
    e.DrawBackground();
4
    // eigenen Kram zeichnen
5
    Brush b = ((e.Index & 1) == 0) ? Brushes.Green : Brushes.Red;
6
    e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), Font, b, 
7
       e.Bounds.Left, e.Bounds.Top);
8
    // Fokus des Eintrags zeichnen lassen
9
    e.DrawFocusRectangle();
10
}

von RingoStar (Gast)


Lesenswert?

@Arc Net

Vielen Dank, Dein Beispiel bekomme ich ans laufen. Jetzt muss ich es 
noch für meine Zwecke verbiegen.
Bei abwechselnden Farben treffe ich nicht immer OK oder NOK :-)

Gruß
RingoStar

von martin (Gast)


Lesenswert?

hallo,

das ist ja schon fast was ich suche!
da ich noch ein blutiger c# anfänger bin ist mir nur noch nicht klar wie 
ich die farben pro textzeile anwenden kann. wenn ich das beispiel 
versuche zu ändern wird immer der ganze text umgefärbt :-(
kann mir vieleicht jemand auf die sprünge helfen wie ich farben pro 
eintrag festlegen kann?

martin

von RingoStar (Gast)


Lesenswert?

Hallo Martin,

da ich mir nicht immer den Index merken will suche ich einfach im String 
nach "OK" und "NOK". Sonst schreibe ich in schwarz. Vieleicht funst das 
auch bei Dir?

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

  Brush b;

  if (lbTestResult.Items[e.Index].ToString().IndexOf("NOK") > 0)
    b = Brushes.Red;
  else if (lbTestResult.Items[e.Index].ToString().IndexOf("OK") > 0)
    b = Brushes.Green;
  else
    b = Brushes.Black;

  e.Graphics.DrawString(((ListBox)sender).Items[e.Index].ToString(),e.Font 
,  b, e.Bounds, StringFormat.GenericDefault);

  e.DrawFocusRectangle();
}

Gruß
RingoStar

von Karl H. (kbuchegg)


Lesenswert?

RingoStar wrote:
> Hallo Martin,
>
> da ich mir nicht immer den Index merken will suche ich einfach im String
> nach "OK" und "NOK". Sonst schreibe ich in schwarz. Vieleicht funst das
> auch bei Dir?

Das ist natürlich eine Möglichkeit.
Die schönere Variante ist es natürlich eine eigene
Item Klasse dafür aufzusetzem. Teil dieser Item Klasse
ist dann eine zusätzliche Member Variable, die die Background
Color dieses Items angibt.
Ansonsten ist alles wie gehabt: Eine Owner Draw Listbox.
In der DrawItem Funktion wird der Hintergrund gemalt, wobei
dann natürlich auf dieses Member zugegriffen wird. Du weist
ja welchen Datentyp die Items in der Listbox tatsächlich haben
und kannst daher dorthin umcasten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.