webForumDet fria alternativet

Problem med att färga item i listbox

.NET

5 svar · 446 visningar · startad av saw

Medlem sedan mars 20011 880 inlägg
Frågan#1

Jag försöker så här

private void lbWriter_DrawItem(object sender, DrawItemEventArgs e)
        {
            e.DrawBackground();
            Brush myBrush = Brushes.Black;
            try
            {
                if (lbWriter.SelectedItem != null)
                {
                    myBrush = Brushes.White;
                }
                else
                {
                    myBrush = Brushes.Black;
                }

                e.Graphics.DrawString(((ListBox)sender).Items[e.Index].ToString(),
                e.Font, myBrush, e.Bounds, StringFormat.GenericDefault);
                e.DrawFocusRectangle();
            }
            catch { }
            
        }

Detta fungerar såtillvida att den selectade raden får vit text på blå bakgrund.
Problemet är att de andra posterna "försvinner" dvs de får den vita textfärgen.
Hur fixar jag detta? :q

Medlem sedan feb. 20002 300 inlägg
#2

Du kollar ju bara om SelectedItem inte är null och är den inte det så ritar du items med vit foreground.

lbWriter_DrawItem anropas när varje enskilt item i din listbox ska ritas ut och i ditt fall kollar du om SelectedItem är null. Dvs. om det finns något item i listboxen som är valt. I ditt fall så kommer alla items ritas med vit text eftersom din listbox har ett item valt.

I parametern DrawItemEventArgs finns en property "Index" som innehåller indexet på det item som ska ritas ut. Jämför det indexet med indexet på SelectedItem. Sammanfaller dem så ska du rita dem annorlunda.

Medlem sedan mars 20011 880 inlägg
#3

Jag försöker enligt dina anvisningar.

if (lbWriter.SelectedItem != null)
                {
                    if (Convert.ToInt32(lbWriter.SelectedIndex) == Convert.ToInt32(e.Index))
                    {
                        myBrush = Brushes.White;
                    }
                }
                else
                {
                    myBrush = Brushes.Black;
                }

 lErrorArrReg.Text = lbWriter.SelectedIndex.ToString() + " = " + e.Index.ToString();

Det gör ingen skillnad och jag kan se via min label(lErrorArrReg) att indexet
stämmer men jag få inte ihop ifsatsen korrekt tror jag.

Medlem sedan feb. 20002 300 inlägg
#4

Gör såhär istället:

e.DrawBackground();
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
{
    e.Graphics.DrawString(lbWriter.Items[e.Index].ToString(), Font, Brushes.Red, e.Bounds);
    e.DrawFocusRectangle();
}
else
{
    e.Graphics.DrawString(lbWriter.Items[e.Index].ToString(), Font, Brushes.Black, e.Bounds);
}
Medlem sedan mars 20011 880 inlägg
#5

Helt suveränt, tusen tack.
En avslutande fråga på detta, går det enkelt att göra den selectade texten fet?

Medlem sedan feb. 20002 300 inlägg
#6

Ja, skapa en ny Font och ange FontStyle.Bold i konstruktorn. Använd sedan den när du ritar items som är selected.

261 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
117 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)