[C#] Probleem met verversen ListBox control

Pagina: 1
Acties:

  • Expecho
  • Registratie: Januari 2001
  • Laatst online: 18:15
ik heb een ListBox gevuld met een aantal items, aan de hand van een bepaalde contitie wordt de kleur van de tekst grijs of zwart. Dit heb ik voor elkaar gekregen door mijn eigen DrawItem event op te nemen.

Dit werkte allemaal prima totdat ik zag dat als ik een regel aanklik de tekst zwart of grijs blijft. Normaal gesproken is het zo dat de tekstkleur van een geselecteerde regel wit wordt (standaard gedrag van windows). Echter door het opnemen van mijn eigen DrawItem event gebeurt dit niet meer.

Ik heb mijn event nu zo aangepast dat de tekstkleur wit wordt op het moment dat ik de regel selecteer door in het event uit te vragen wat de index is van de ListBox.

Maar, nu komt het echte probleem, als ik nu een andere regel selecteer blijft de tekstkleur van de laatst geselecteerde regel wit. Dit valt nu helemaal weg tegen de witte achtergrondkleur van de ListBox, ofwel het geheel is onleesbaar.

Toen dacht ik slim te zijn door in het SelectedIndexChanged event een Refresh() op te nemen zodat de Listbox alle items opnieuw op het scherm zet. Gevolg: een zichtbare refresh van de listbox wat vrij storend en lelijk is.

Weet iemand hoe ik deze Refresh kan vervangen door een stuk code wat alleen de laatst geselecteerde regel refreshed? Of hoe ik het standaard gedrag (witte tekst bij geselecteerde regel) weer kan aanzetten zonder mijn eigen DrawItem te moeten verwijderen?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Color color = Color.FromKnownColor(KnownColor.WindowText);

string[] buttonInfo;
                        
buttonInfo = lbButtons.GetItemText(lbButtons.Items[e.Index]).Split('\t');

if(lbButtons.SelectedIndex == e.Index)
    color = Color.FromKnownColor(KnownColor.HighlightText); 
                
if((string)buttonInfo.GetValue(16) == "False")
   color = Color.FromKnownColor(KnownColor.GrayText);
                            
e.DrawBackground(); 
e.Graphics.DrawString(lbButtons.Items[e.Index].ToString(), lbButtons.Font, 
new SolidBrush(color),e.Bounds); 
e.DrawFocusRectangle();

  • Expecho
  • Registratie: Januari 2001
  • Laatst online: 18:15
Hebbes, oplossing ligt in het gebruik van DrawItemState (thanx Joroz)

Oplossing is als volgt:


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Color color = Color.FromKnownColor(KnownColor.WindowText);
string[] buttonInfo;
                        
buttonInfo = lbButtons.GetItemText(lbButtons.Items[e.Index]).Split('\t');

if((string)buttonInfo.GetValue(16) == "False")
   color = Color.FromKnownColor(KnownColor.GrayText);
            
if((e.State & DrawItemState.Selected) == 
     DrawItemState.Selected)
     color = Color.FromKnownColor(KnownColor.HighlightText); 
                
e.DrawBackground(); 
e.Graphics.DrawString(lbButtons.Items[e.Index].ToString(), lbButtons.Font, 
new SolidBrush(color),e.Bounds); 
e.DrawFocusRectangle();