Как изменить ForeColor отдельных элементов в ComboBox?(C # Winforms) - PullRequest
0 голосов
/ 08 сентября 2011

Я знаю, что могу изменить ForeColor ComboBox следующим образом:

comboBox1.ForeColor = Color.Red;

Но это делает все предметы этого цвета. Когда вы опускаете ComboBox, каждый отдельный элемент становится красным.

Я хочу индивидуально покрасить предметы, чтобы первый элемент был всегда черный, второй всегда красный, третий всегда синий и так далее. Это возможно?

Кроме того, я не думаю, что смогу создать UserControl для этого, потому что я использую ComboBox для Toolstrips.

Ответы [ 2 ]

2 голосов
/ 08 сентября 2011

Вы можете использовать Событие DrawItem .

Это событие используется нарисованным владельцем ComboBox. Вы можете использовать это событие для выполнения задач, необходимых для рисования элементов в ComboBox. Если у вас есть элемент переменного размера (когда свойство DrawMode установлено в DrawMode.OwnerDrawVariable), перед рисованием элемента, MeasureItem событие поднято. Вы можете создать обработчик события для MeasureItem событие для определения размера элемента, который вы собираетесь нарисовать ваш обработчик события DrawItem.

MSDN Пример:

// You must handle the DrawItem event for owner-drawn combo boxes.  
// This event handler changes the color, size and font of an 
// item based on its position in the array.
protected void ComboBox1_DrawItem(object sender, 
            System.Windows.Forms.DrawItemEventArgs e)
{

    float size = 0;
    System.Drawing.Font myFont;
    FontFamily family = null;

    System.Drawing.Color animalColor = new System.Drawing.Color();
    switch(e.Index)
    {
        case 0:
            size = 30;
            animalColor = System.Drawing.Color.Gray;
            family = FontFamily.GenericSansSerif;
            break;
        case 1:
            size = 10;
            animalColor = System.Drawing.Color.LawnGreen;
            family = FontFamily.GenericMonospace;
            break;
        case 2:
            size = 15;
            animalColor = System.Drawing.Color.Tan;
            family = FontFamily.GenericSansSerif;
            break;
    }

    // Draw the background of the item.
    e.DrawBackground();

    // Create a square filled with the animals color. Vary the size
    // of the rectangle based on the length of the animals name.
    Rectangle rectangle = new Rectangle(2, e.Bounds.Top+2, 
            e.Bounds.Height, e.Bounds.Height-4);
    e.Graphics.FillRectangle(new SolidBrush(animalColor), rectangle);

    // Draw each string in the array, using a different size, color,
    // and font for each item.
    myFont = new Font(family, size, FontStyle.Bold);
    e.Graphics.DrawString(animals[e.Index], myFont, System.Drawing.Brushes.Black, new RectangleF(e.Bounds.X+rectangle.Width, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height));

    // Draw the focus rectangle if the mouse hovers over an item.
    e.DrawFocusRectangle();
}

РЕДАКТИРОВАТЬ: Только что нашел похожую тему .

1 голос
/ 16 февраля 2012

Для ToolStripComboBox, производного от ToolStripControlHost.

//Declare a class that inherits from ToolStripControlHost.
public class ToolStripCustomCombo : ToolStripControlHost
{
    // Call the base constructor passing in a MonthCalendar instance.
    public ToolStripCustomCombo() : base(new ComboBox()) { }

    public ComboBox ComboBox
    {
        get
        {
            return Control as ComboBox;
        }
    }
}

Затем, скажем, у вас есть набор инструментов с именем m_tsMain.Вот как добавить новый элемент управления.

ToolStripCustomCombo customCombo = new ToolStripCustomCombo();
ComboBox c = customCombo.ComboBox;
c.Items.Add("Hello World!!!");
c.Items.Add("Goodbye cruel world!!!");
m_tsMain.Items.Add(customCombo);

И вы сможете добавить обработчик событий в c для DrawItem.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...