unter visual c# Einträge in einer Listbox einfärben

Gast #725926
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
#726028
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.
#726066
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
}
Gast #726108
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
Gast #734646
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
Gast #734847
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
#735030
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren