Frage Einzelne Elemente in einer winforms ComboBox farbig darstellen?


Ich habe ein Dilemma, bei dem ich ein Formular habe, das eine Anzahl von Comboboxen enthält, die Informationen / Optionen / Elemente enthalten, die unter bestimmten Umständen ungültig / veraltet sein können.

Ich kann nicht einfach die veralteten Informationen aus den Elementen entfernen, aber ich möchte dem Benutzer einen visuellen Hinweis geben, wenn Optionen ungültig sind.

Ich dachte daran, die Items einzufärben (wahrscheinlich rot), um anzuzeigen, ob und wann sie ungültig sind. Ich muss nicht unbedingt verhindern, dass ein Benutzer eine ungültige Option auswählt, sondern mache ihm nur visuell bewusst, dass dies der Fall ist.

Kann das gemacht werden? Kannst du - dyamisch - den Farbraum von Combobox-Items ändern?

Vielen Dank,


21
2018-01-12 10:10


Ursprung


Antworten:


Sie können DrawItem-Ereignis von ComboBox versuchen. Bewahren Sie Ihre Daten auf einer Liste auf und vergleichen Sie sie mit IDs und putzen Sie Ihre Artikel.

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);
}

Dieses Ereignis auslösen (Danke an @Bolu)

Sie müssen ComboBox.DrawMode ändern   zu OwnerDrawFixed / OwnerDrawVariable zu   fire das ComboBox_DrawItem


38
2018-01-12 10:18



///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));

Die Quell-URL-Seite: http://www.tyrodeveloper.com/2012/04/color-in-combobox-item.html


5
2018-04-20 21:40



Ändern der Farbe der Combobox-Hintergrundfarbe

Sie können diese Codes verwenden, um die Farbe der Combobox zu ändern.

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
2017-07-04 16:42