ListBox1_DrawItem Problem
-
private void listBox1_DrawItem(object sender, DrawItemEventArgs e) { int itemSelectedIndex = listBox1.SelectedIndex; int index = e.Index; Rectangle itemRect = e.Bounds; if(index == itemSelectedIndex) { e.Graphics.FillRectangle(Brushes.Blue, itemRect); } else { e.Graphics.FillRectangle(Brushes.Green, itemRect); } }
erreichen wollte ich einfach damit das wenn ein Item ausgewaehlt ist einen Blauen hintergrund kriegt falls nich dann Gruen. Jedoch passiert es wenn ich eins auswahle ist es zwar Blau jedoch bleibt es fuer immer so..
-
Hast du die DrawMode Eigenschaft deiner ListBox richtig gesetzt? Sonst wird das DrawItem event soviel ich weis nicht ausgelöst.
-
Oh sorry, hab's nicht richtig gelesen
. Wenn es balu wird und dann bleibt, dann ist dein DrawMode auch richtig gesetzt.
Evtl. könntest du bei SelectedIndexChanged ein Invalidate() oder Refresh() aufrufen, dann müssten eigentlich alle Items gezeichnet werden (vielleicht nicht die beste Lösung, müsste aber funktionieren).
-
Ich meine das liegt daran, das wenn du selectedIndex setzt, der eventhandler automatisch mit aufgerufen wird, und deshalb immer der gleiche Wert in deiner if Klausel ausgewertet wird...in diesem Fall blue!
-
Wieso soll immer der gleiche wert ausgewertet werden? Normalerweise 'weis' die ListBox selbst, wann sie das DrawItem event auslösen muss. SelectedIndex wird wird in dem Code ja auch garnicht gesetzt, sondern nur abgerufen. Sonst würde das ganze ja in einer Endlosschleife enden...
Und wenn ListView.SelectedIndex von außen gestzt wird, wird der EventHandler natülich aufgerufen. Es wird ein anderes Item selektiert, und das soll ja durch das zeichnen hervorgehoben werden.
-
Sorry, hatte das
int itemSelectedIndex = listBox1.SelectedIndex;
wohl nicht korrekt gelesen...
-
Ihr habt doch alle keinen Plan.
Die Listbox muss neu gezeichnet werden, damit die Hintergrundfarbe an der abgewählten Position wieder zurückgesetzt wird.
Das erreicht man für gewöhnlich mit den Refresh() oder Update() Methoden der Listbox, welche man im EventHandler vom IndexChange aufruft. Allerdings kommt es vor, dass die Listbox dann flackert wenn man viel selbst zeichnet.
Abhilfe schafft hier subclassing und das Setzen der folgenden Styles:
public partial class ListBoxEx : ListBox { public ListBoxEx() { base.SetStyle(ControlStyles.DoubleBuffer, true); base.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); base.SetStyle(ControlStyles.AllPaintingInWmPaint, true); base.SetStyle(ControlStyles.Opaque, true); InitializeComponent(); } }
-
B00nbuster schrieb:
Ihr habt doch alle keinen Plan.
Wenn du eine Zeichenoperation über ein Graphics objekt ausführst, ist das Ergebnis direkt sichtbar. Oder was meinst du was dein Refresh(), Update() oder Invalidate() bzw. WM_PAINT unter anderem machen? Sie holen (erstellen) ein Graphics Objekt und lösen das DrawItem ereignis aus. Wenn das nicht so wäre, würdest du nach einem Update gar nichts von der Zeichnerei im EventHandler sehen.
Also wenn hier einer keinen Plan hat...