DataGridComboxColumn: как изменить основной цвет при отображении списка элементов - PullRequest
0 голосов
/ 13 марта 2019

У меня есть представление данных с DataGridComboboxColumn, я использую событие CellFormating, чтобы изменить цвет ячейки этого столбца:

 private void dataTachesToday_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
        Color c = Color.Pink;
        if (e.ColumnIndex == 4)
        {
            switch (e.Value.ToString())//statut
            {
                case "A faire":
                    c = Color.DeepSkyBlue;
                    break;
                case "En cours":
                    c = Color.HotPink;
                    break;
                case "interrompue":
                    c = Color.Gold;
                    break;
                case "Terminée":
                    c = Color.SpringGreen;
                    break;
                case "Annulée":
                    c = Color.LightGray;
                    break;
            }

            e.CellStyle.ForeColor = c;
        }
    }

Но когда я щелкаю, чтобы выбрать другой элемент, все элементы занимают один и тот же цвет ячейки, я хочу, чтобы каждый элемент имел свой заданный цвет (возможно, с помощью события DropDownOpened , но это используется для выпадающего списка, а не DataGridComboxColumn)

Вы можете увидеть здесь, в чем моя проблема: enter image description here

1 Ответ

1 голос
/ 13 марта 2019

Прежде всего, добавьте один обработчик событий EditingControlShowing для DataGridView либо из окна свойств, либо из вашего Form_Load.

private void Form_Load(object sender, EventArgs e)
{
    dataGridView1.EditingControlShowing += dataGridView1_EditingControlShowing;
}

Затем добавьте приведенный ниже код в обработчик событий EditingControlShowing,

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    if (dataGridView1.CurrentCell.ColumnIndex == 1 && e.Control is ComboBox)  //<= Specify your data grid view combo box column index instead of 1
    {
        ComboBox comboBox = e.Control as ComboBox;
        comboBox.DrawMode = DrawMode.OwnerDrawFixed;
        comboBox.DrawItem -= ComboBox_DrawItem;
        comboBox.DrawItem += ComboBox_DrawItem;
    }
}

И основная логика для изменения цвета для каждого элемента в столбце комбинированного окна,

private void ComboBox_DrawItem(object sender, DrawItemEventArgs e)
{
    Brush brush = null;
    var g = e.Graphics;

    if (e.Index >= 0)
    {
        string item = ((ComboBox)sender).Items[e.Index].ToString();

        switch (item)
        {
            case "A faire":
                brush = Brushes.DeepSkyBlue;
                break;
            case "En cours":
                brush = Brushes.HotPink;
                break;
            case "interrompue":
                brush = Brushes.Gold;
                break;
            case "Terminée":
                brush = Brushes.SpringGreen;
                break;
            case "Annulée":
                brush = Brushes.LightGray;
                break;
        }

        g.DrawString(item, e.Font, brush, e.Bounds);
        e.DrawFocusRectangle();
    }
}

Вывод:

enter image description here

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