Domanda Colore di sfondo di un oggetto ListBox (winforms)


Come posso impostare il colore di sfondo di un oggetto specifico in un System.Windows.Forms.ListBox? Mi piacerebbe essere in grado di impostare più di una volta, se possibile.


44
2017-09-18 11:24


origine


risposte:


Probabilmente l'unico modo per farlo è disegnare gli oggetti da soli.

Impostare il DrawMode a OwnerDrawFixed

e codificare qualcosa come questo nell'evento DrawItem:

private void listBox_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();
    Graphics g = e.Graphics;

    g.FillRectangle(new SolidBrush(Color.Silver), e.Bounds);

    // Print text

    e.DrawFocusRectangle();
}

La seconda opzione sarebbe utilizzare un controllo ListView, anche se hanno un altro modo di implementazioni (non realmente legato ai dati, ma più flessibile in termini di colonne)


51
2017-09-18 11:28



Grazie per risposta di Grad van Horck, mi ha guidato nella direzione corretta.

Per supportare il testo (non solo il colore di sfondo), ecco il mio codice pienamente funzionante:

//global brushes with ordinary/selected colors
private SolidBrush reportsForegroundBrushSelected = new SolidBrush(Color.White);
private SolidBrush reportsForegroundBrush = new SolidBrush(Color.Black);
private SolidBrush reportsBackgroundBrushSelected = new SolidBrush(Color.FromKnownColor(KnownColor.Highlight));
private SolidBrush reportsBackgroundBrush1 = new SolidBrush(Color.White);
private SolidBrush reportsBackgroundBrush2 = new SolidBrush(Color.Gray);

//custom method to draw the items, don't forget to set DrawMode of the ListBox to OwnerDrawFixed
private void lbReports_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();
    bool selected = ((e.State & DrawItemState.Selected) == DrawItemState.Selected);

    int index = e.Index;
    if (index >= 0 && index < lbReports.Items.Count)
    {
        string text = lbReports.Items[index].ToString();
        Graphics g = e.Graphics;

        //background:
        SolidBrush backgroundBrush;
        if (selected)
            backgroundBrush = reportsBackgroundBrushSelected;
        else if ((index % 2) == 0)
            backgroundBrush = reportsBackgroundBrush1;
        else
            backgroundBrush = reportsBackgroundBrush2;
        g.FillRectangle(backgroundBrush, e.Bounds);

        //text:
        SolidBrush foregroundBrush = (selected) ? reportsForegroundBrushSelected : reportsForegroundBrush;
        g.DrawString(text, e.Font, foregroundBrush, lbReports.GetItemRectangle(index).Location);
    }

    e.DrawFocusRectangle();
}

Quanto sopra aggiunge al codice dato e mostrerà il testo corretto più evidenzia l'elemento selezionato.


53
2017-09-14 13:46



// Set the background to a predefined colour
MyListBox.BackColor = Color.Red;
// OR: Set parts of a color.
MyListBox.BackColor.R = 255;
MyListBox.BackColor.G = 0;
MyListBox.BackColor.B = 0;

Se ciò che intendi impostando più colori di sfondo è l'impostazione di un colore di sfondo diverso per ogni elemento, questo non è possibile con un ListBox, ma IS con un ListView, con qualcosa di simile:

// Set the background of the first item in the list
MyListView.Items[0].BackColor = Color.Red;

2
2017-09-18 11:31



     public Picker()
    {
        InitializeComponent();
        this.listBox.DrawMode = DrawMode.OwnerDrawVariable;
        this.listBox.MeasureItem += listBoxMetals_MeasureItem;
        this.listBox.DrawItem += listBoxMetals_DrawItem;
    }

    void listBoxMetals_DrawItem(object sender, DrawItemEventArgs e)
    {
        e.DrawBackground();
        Brush myBrush = Brushes.Black;
        var item = listBox.Items[e.Index] as Mapping;
        if (e.Index % 2 == 0)
        {
            e.Graphics.FillRectangle(new SolidBrush(Color.GhostWhite), e.Bounds);
        }
        e.Graphics.DrawString(item.Name,
            e.Font, myBrush, e.Bounds, StringFormat.GenericDefault);
        e.DrawFocusRectangle();
    }

Campione completo


0
2017-07-09 06:55



private void listbox1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
        {
            e.DrawBackground();
            Brush myBrush = Brushes.Black;
                var item = listbox1.Items[e.Index];
                if(e.Index % 2 == 0)
                {
                    e.Graphics.FillRectangle(new SolidBrush(Color.Gold), e.Bounds);
                }


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


public MainForm()
        {
            InitializeComponent();
            this.listbox1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.listbox1_DrawItem);
        }

0
2018-01-13 09:44