mikrocontroller.net

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


Autor: RingoStar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: RingoStar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was bedeutet Ownerdraw-Listbox?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist eine Listbox mit dem Fensterstil WS_OWNERDRAW.

Autor: Helmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuch mal den Link

http://www.codeguru.com/cpp/controls/listbox/color...

so habe ich auch mal eine Listbox eingefaerbt

Gruss Helmi

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: RingoStar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht 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:
private void listBox1_DrawItem(object sender, DrawItemEventArgs e) {
    // Hintergrund zeichnen lassen
    e.DrawBackground();
    // eigenen Kram zeichnen
    Brush b = ((e.Index & 1) == 0) ? Brushes.Green : Brushes.Red;
    e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), Font, b, 
       e.Bounds.Left, e.Bounds.Top);
    // Fokus des Eintrags zeichnen lassen
    e.DrawFocusRectangle();
}

Autor: RingoStar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: RingoStar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.