Entwickler-Ecke
WinForms - Farbe der Einträge in der ListBox einzeln ändern
Captain_Jack_Sparrow - Sa 18.02.06 23:32
Titel: Farbe der Einträge in der ListBox einzeln ändern
HalliHallo..
Wie Ihr wahrscheinlich merkt, bin ich noch blutiger C#-Anfänger.
Meine Frage diesmal:
Mit z.B.
C#-Quelltext
1:
| listBox1.ForeColor = System.Drawing.Color.Red; |
kann man bekanntlicherweise die die Schriftfarbe aller Einträge in der ListBox1 ändern. Kann man auch die Farben der einzelnen Einträge unabhängig voneinander ändern?
Moderiert von
Christian S.: C#-Tags hinzugefügtModeriert von
Christian S.: Topic aus C# - Die Sprache verschoben am Di 21.02.2006 um 18:33
Christian S. - Mo 20.02.06 21:11
Hallo!
Dazu musst Du die Items selber zeichnen. Wie das geht, verrät Dir die Hilfe zum DrawItem-Ereignis der Listbox, da ist sogar ein Code-Beispiel zum Zeichnen von farbigen Items ;-)
Grüße
Christian
Captain_Jack_Sparrow - Di 21.02.06 19:17
Huuii..
Da hat ja scheinbar jmd. Ahnung ;)
Hab ewigkeiten gegooglet aber nichts gefunden. Entweder beherrsche ich die Suchmaschinen nicht, oder.. keine ahnung was sonst ;)
Werds mir bei gelegenheit angucken und mich melden.. Danke :)
Captain_Jack_Sparrow - Mi 22.02.06 22:43
Titel: Ratlos :(
Hey!
Irgendwie verstehe ich das nicht so ganz.
Ich habe eine fertige Listbox ("listEingaben") und abhängig vom Inhalt der Variable "cVorzeichen" ('+' oder '-') soll der Eintrag schwarz bzw. rot markiert werden. Was muss ich denn jetzt machen damit ich das hinbekomme?
Christian S. - Mi 22.02.06 22:47
Wie sieht denn Dein Quelltext aus? In der Dokumentation steht doch sogar ein Code-Beispiel!
Captain_Jack_Sparrow - Mi 22.02.06 22:54
Ich weiß, dass da ein Code-Beispiel steht, aber bin -wie gesagt- noch C#-Neuling und verstehe den nicht wirklich *schäm*
--
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| private void listAnzeigen() { if (cVorzeichen == '-') { listEingaben.ForeColor = System.Drawing.Color.Red; } else { listEingaben.ForeColor = System.Drawing.Color.Black; } } |
Ich weiß nicht, wie ich da jetzt den Beispielcode einbauen soll, damit eben nicht ForeColor da steht und nicht ALLES sondern nur das entsprechende Item gefärbt wird.
Christian S. - Mi 22.02.06 22:58
Du musst im DrawItem-Ereignis der Listbox die entsprechende Farbe für das Item setzen, welches gerade gezeichnet werden soll. Wie das geht :arrow: Dokumentation
Ich weiß im Moment auch nicht, wie ich Dir da weiter helfen kann. Wenn Du mit der Dokumentation nicht klar kommst, dann frag am Besten zu den unklaren Stellen.
Captain_Jack_Sparrow - Mi 22.02.06 23:06
Also in der Dokumentation finde ich diesen Beispielcode:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| private void listBox1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) { listBox1.DrawMode = DrawMode.OwnerDrawFixed; e.DrawBackground(); Brush myBrush = Brushes.Black;
switch (e.Index) { case 0: myBrush = Brushes.Red; break; case 1: myBrush = Brushes.Orange; break; case 2: myBrush = Brushes.Purple; break; }
e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), e.Font, myBrush,e.Bounds,StringFormat.GenericDefault); e.DrawFocusRectangle(); } |
Ich weiß jetzt aber nicht wirkich, wie ich diesen Code anwenden soll.
Christian S. - Mi 22.02.06 23:06
Hast Du ihn einfach mal ins DrawItem-Ereignis geschrieben?
Captain_Jack_Sparrow - Mi 22.02.06 23:12
öööhm.. Wahrscheinlich nich..
Wie mache ich das? :oops: Sorry ich verstehe im Moment nur Bahnhof
Wie soll ich das ins DrawItem-Ereignis schreiben?
Christian S. - Mi 22.02.06 23:16
Hallo!
Das ist einfach :-)
Du markierst die Listbox und in dem Fenster, in dem die Eigenschaften der Listbox angezeigt werden, klickst Du oben auf das "Blitz"-Symbol (sorry, mir fällt kein besserer Name ein). Dadurch werden nicht mehr die Eigenschaften, sondern die Ereignisse der Listbox angezeigt.
In der Liste der Ereignisse findest Du auch das Ereignis "DrawItem". Doppelklick drauf und der entsprechende Quellcode-Rohbau wird erstellt. Und für die erstellte Methode nimmst Du dann die, die in der Hilfe steht.
Grüße
Christian
Captain_Jack_Sparrow - Mi 22.02.06 23:24
achsoo.. ja gut, des hab ich hinbekommen..
und jetzt brauch ich einfach nur in meiner if e.index den wert 0, 1, oder 2 zuweisen oder wie was?
Christian S. - Mi 22.02.06 23:26
In dem switch-Teil wird entschieden, welche Farbe für das aktuelle Item verwendet wird. In diesem Fall werden nur die ersten drei Items (also Index 0,1,2) unterschieden. An dieser Stelle musst Du nun Dein Entscheidungskriterium für die Farbe einfügen, wie immer das aussehen mag ;-)
Captain_Jack_Sparrow - Mi 22.02.06 23:38
so hatte ich es auch zuerst interpretiert, aber die sind immernoch alle schwarz -.-
Christian S. - Mi 22.02.06 23:42
Oh, in der "Anleitung" weiter oben vergessen, aber in der Doku steht es. Stell den DrawMode der Listbox mal auf OwnerDrawFixed.
Captain_Jack_Sparrow - Mi 22.02.06 23:44
C#-Quelltext
1:
| listBox1.DrawMode = DrawMode.OwnerDrawFixed; |
steht doh im code, st also.. oder muss ich nochw as machen?
Christian S. - Mi 22.02.06 23:47
Christian S. hat folgendes geschrieben: |
Oh, in der "Anleitung" weiter oben vergessen, aber in der Doku steht es. Stell den DrawMode der Listbox mal auf OwnerDrawFixed. |
Ein Blick in eben diese Doku, fördert folgendes Zitat zu Tage:
Zitat: |
Dieses Ereignis wird von einer Ownerdrawn-ListBox verwendet. Das Ereignis wird nur ausgelöst, wenn die DrawMode-Eigenschaft auf DrawMode.OwnerDrawFixed oder DrawMode.OwnerDrawVariable festgelegt ist. |
Und damit es völlig egal, dass das im Code steht, weil der gar nicht ausgeführt wird, wenn Du die Eigenschaft nicht vorher schon setzt. Das tust Du in den Eigenschaften der Listbox.
Captain_Jack_Sparrow - Mi 22.02.06 23:47
ach ich muss das nochmal in den komischen eigenschaften da machen?!? naja hab gemacht und soweit klappts :)
jetzt is erstmal nactruhe und morgen passe ich es an.. dankeschön :)
Captain_Jack_Sparrow - Do 23.02.06 22:12
Ich versteh's einfach nicht *kopfschüttel*
Das von oben funktioniert einwandfrei. Aber da das jetzt nicht nach dem Index der einzelnen Einträge farbig werden soll, sondern je nach Inhalt der Variable cVorzeichen habe ich den Code so umgebaut:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| private void listEingaben_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) { Brush myBrush = Brushes.Black; if (cVorzeichen == '-') { myBrush = Brushes.Red; } else { myBrush = Brushes.Black; }
e.Graphics.DrawString(listEingaben.Items[e.Index].ToString(), e.Font, myBrush,e.Bounds,StringFormat.GenericDefault); } |
Der Inhalt von cVorzeichen ändert sich ständig und damit jedesmal die Farbe ALLER Einträge. Kann man das nicht so machen, dass sich nur die Farbe des Eintrages, den man gerade erstellt ändert?
Ich will also nicht im Nachhinnein ändern sondern schon beim Erstellen des Eintrages die Farbe festlegen.
Christian S. - Do 23.02.06 22:39
Hallo!
Was meinst Du mit "cVorzeichen ändert sich ständig". cVorzeichen ändert sich doch nirgendwo. :nixweiss:
Du weisst schon, dass das DrawItem-Event immer dann, wenn das Item gezeichnet wird, aufgerufen wird? Und das passiert ja nicht nur beim Befüllen der Listbox, sondern immer, wenn sich an der Darstellung was ändert, wennn also z.B. ein Eintrag markiert wird!
Grüße
Christian
Captain_Jack_Sparrow - Do 23.02.06 22:51
Hallo!
Ich meine der Wert von cVorzeichen ändert sich. Den Teil, in dem er sich ändert ist hier nicht... Passiert einfach wenn man auf einen Button klickt, ist aber meiner Meinung anch nicht wichtig. Wollte nur ausdrücken, DASS er sich ändert ;)
Das das DrawItem-Event so häufig aufgerufen wurde, war mir bis gerade eben nicht klar, sorry... Aber ob mich das großartig auf andere Wege geleitet hätte.. Ich wage es zu bezweifeln ;)
Also nochmal mein Problem komplett:
Ich habe eine TextBox in die der User eine Zahl eingibt. Dann klickt er au den Button "Hinzufügen" oder auf "Abziehen". Klickt er auf "Hinzufügen" wird
cVorzeichen = '+';, klickt er hingegen auf "Abziehen" wird cVorzeichen = '-';
In einer Listbox werden dann die getätigten Aktionen angezeigt, also cVorzeichen und anschließend die eingegebene Zahl ausgegeben. Zur Verdeutlichung soll der Eintrag, wenn cVorzeichen = '+' ist, der Eintrag schwarz und wenn cVorzeichen = '-' ist, der Eintrag rot gefärbt sein.
Kann doch nicht sein, dass das so umständlich ist. (Oder bin ich einfach nur zu blöd dazu?!?)
Christian S. - Do 23.02.06 22:56
Hallo!
Okay, nochmal: DrawItem wird für immer dann aufgerufen, wann ein Item neu gezeichnet wird. Das kann auch fünf Minuten, nachdem dieses Item eingefügt wurde, sein und dann nochmal zehn Minuten später. Oder zehn Sekunden. Auf jeden Fall musst Du davon ausgehen, dass der Wert von cVorzeichen zu diesem Zeitpunkt nicht mehr der Wert ist, den cVorzeichen zum Zeitpunkt des Hinzufügens hatte!
Du musst Dir also für jedes Item den Wert von cVorzeichen separat merken, damit Du ihn zu jedem Zeitpunkt abrufen kannst.
Grüße
Christian
Captain_Jack_Sparrow - Do 23.02.06 23:02
Achsooooooooooooooooo...
ja klar.. *klooooooooooooong*
verdammt^^ weil der ruft ja jedesmal den Wert von cVorzeichen neu ab..
ok, is logisch *g*
Aber anstatt 10 cVorzeichen-Variablen (weil 10 Einträge in der Listbox) kann ich doch auch "einfach" das Vorzeichen (=erste Zeichen) des jeweiligen Eintrages ermitteln, oder ist das zu umständlich?
Christian S. - Do 23.02.06 23:14
Hallo!
Ja, das sollte auch gehen. Den Inhalt des Items als String rufst Du ja eh schon ab, da schnell mal zu sehen, was das erste Zeichen ist, macht ja nicht viel Arbeit ;-)
Grüße
Christian
Captain_Jack_Sparrow - Do 23.02.06 23:52
hmm
habe jetzt
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| private void listEingaben_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) { Brush myBrush = Brushes.Black; if (int.Parse (listEingaben.Items[e.Index].ToString()) < 0 ) { myBrush = Brushes.Red; } else { myBrush = Brushes.Black; }
e.Graphics.DrawString(listEingaben.Items[e.Index].ToString(), e.Font, myBrush,e.Bounds,StringFormat.GenericDefault); } |
Aber der Debugger liefter einen fehler zurück, weil die Einträge SO hinzugefügt werden:
Edit: Die einzelnen Einträge werden so hinzugefügt:
C#-Quelltext
1:
| listEingaben.Items.Insert(0, cVorzeichen + " " + datenSammeln() + " * " + dWert + " €"); |
datenSammeln() liefert hierbei einen ushort zurück.
Hast Du/irgendjemand anderes ne Ahnung, wie ich nur das erste Zeichen abfragen kann?
Christian S. - Fr 24.02.06 00:04
Du kannst doch einfach mittels myString[0] auf das erste Zeichen eines Strings zugreifen (gibt einen Char).
Captain_Jack_Sparrow - Fr 24.02.06 00:20
Titel: Große Freude
Hallo noch ein letztes Mal (zumindest in diesem Topic)
Ich habe es endlich geschafft :) :beer:
C#-Quelltext
1:
| if ((listEingaben.Items[e.Index].ToString()).Substring(0, 1)== "-") |
Habs einfach so gemacht und schon klappts...
Das war ja mal ne schwere Geburt...
Danke, dass du mir geholfen hast und nicht einfach keinen Bock mehr hattets (auch wenn ichs verstehen könnte).
:) Danke... Endlich hab ich (ok, eigentlich wir) es geschafft ;) Dankeschön :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!