web-dev-qa-db-fra.com

Colorier des éléments individuels dans une ComboBox winforms?

J'ai un dilemme selon lequel j'ai un formulaire qui contient un certain nombre de comboboxes qui contiennent des informations/options/éléments qui peuvent être invalides/obsolètes dans certaines circonstances.

Je ne peux pas simplement supprimer les informations obsolètes des éléments, mais je veux donner à l'utilisateur un indice visuel lorsque les options ne sont pas valides.

Je pensais à colorier les articles (probablement en rouge) pour indiquer si et quand ils ne sont pas valides. Je n'ai pas nécessairement besoin d'empêcher un utilisateur de sélectionner une option non valide, il suffit de lui faire savoir visuellement qu'il le fait.

Cela peut-il être fait? Pouvez-vous - de manière dynamique - changer le colo (u) r des objets combobox?

Merci,

21
Mike

Vous pouvez essayer l'événement DrawItem de ComboBox. Gardez vos dates sur une liste et comparez-les avec les identifiants et brossez vos articles.

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{    
    // Draw the background 
    e.DrawBackground();        

    // Get the item text    
    string text = ((ComboBox)sender).Items[e.Index].ToString();

    // Determine the forecolor based on whether or not the item is selected    
    Brush brush;
    if (YourListOfDates[e.Index] < DateTime.Now)// compare  date with your list.  
    {
        brush = Brushes.Red;
    }
    else
    {
        brush = Brushes.Green;
    }

    // Draw the text    
    e.Graphics.DrawString(text, ((Control)sender).Font, brush, e.Bounds.X, e.Bounds.Y);
}

Pour déclencher cet événement (merci à @Bolu)

Vous devez remplacer ComboBox.DrawMode par OwnerDrawFixed/OwnerDrawVariable pour déclencher le comboBox_DrawItem

42
Pabuc
///The ComboBoxCustom Control:

using System;
using System.Windows.Forms;
using System.Drawing;
namespace TyroDeveloper
{
    public class ComboBoxCustom:ComboBox
    {
        public ComboBoxCustom() { 
            this.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; 
        }
        protected override void OnDrawItem(DrawItemEventArgs e)
        {
            base.OnDrawItem(e);
            e.DrawBackground();
            ComboBoxItem item = (ComboBoxItem)this.Items[e.Index];
            Brush brush = new SolidBrush(item.ForeColor);
            if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) 
            { brush = Brushes.Yellow; }
            e.Graphics.DrawString(item.Text, this.Font, brush, e.Bounds.X, e.Bounds.Y);
        }
    }
    public class ComboBoxItem
    {
        public ComboBoxItem() { }

        public ComboBoxItem(string pText, object pValue)
        {
            text = pText; val = pValue;
        }

        public ComboBoxItem(string pText, object pValue, Color pColor)
        {
            text = pText; val = pValue; foreColor = pColor;
        }

        string text = "";
        public string Text { 
            get { return text; } set { text = value; } 
        }

        object val;
        public object Value { 
            get { return val; } set { val = value; } 
        }

        Color foreColor = Color.Black;
        public Color ForeColor { 
            get { return foreColor; } set { foreColor = value; } 
        }

        public override string ToString()
        {
            return text;
        }
    }
}

//To add the items:

comboBoxCustom1.Items.Add(new ComboBoxItem("México","0",Color.Green));
comboBoxCustom1.Items.Add(new ComboBoxItem("USA", "1", Color.Blue));
comboBoxCustom1.Items.Add(new ComboBoxItem("China", "2", Color.Red));

la page d'URL source: http://www.tyrodeveloper.com/2012/04/color-in-combobox-item.html

5
tyrodeveloper

Changement de couleur de la couleur arrière de la combobox

Vous pouvez utiliser ces codes pour changer la couleur arrière de la zone de liste déroulante.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Comboboxrenklendir
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }



    private void cmbrenkli_DrawItem(object sender, DrawItemEventArgs e)
    {




        Color HighlightColor = Color.Red;

        if (e.Index >=0)
        {

            //int sayi = cmbrenkli.Items.Count;

            string deger = cmbrenkli.Items[e.Index].ToString();

            if (deger == "30"|| deger == "50")
            {
                e.Graphics.FillRectangle(new SolidBrush(HighlightColor), e.Bounds);
            }



            e.Graphics.DrawString(cmbrenkli.Items[e.Index].ToString(), e.Font, new SolidBrush(cmbrenkli.ForeColor), new Point(e.Bounds.X, e.Bounds.Y));

            e.DrawFocusRectangle();

        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        cmbrenkli.Items.Add("10");
        cmbrenkli.Items.Add("20");
        cmbrenkli.Items.Add("30");
        cmbrenkli.Items.Add("40");
        cmbrenkli.Items.Add("50");
    }
}
}
1
Mehmet SARI