Как изменить цвет ячейки DataGridView в зависимости от значения Combobox?

У меня есть датагридвью, как показано ниже:

введите описание изображения здесь

Мне бы хотелось:

  • Когда форма загружается, если Gender Значение столбца - Мужской, соответствующая цветовая ячейка столбца. Name будет белым

  • Когда, если изменяется значение столбца Gender: Мужской → женский, цветная ячейка столбца Name будет DarkGray, иначе при изменении значения столбца Gender: Женский → мужской, цветная ячейка столбца Name будет белым

Я пробовал это, но я не в состоянии сделать это:

    private void dataGridView_CurrentCellDirtyStateChanged(object sender, EventArgs e)
    {
        DataGridView dgv = sender as DataGridView;
        DataGridViewCell cell = dgv.CurrentCell;

        if (dgv.Rows[cell.RowIndex].Cells["Gender"].Value.ToString().Trim() == "Male")
        {
            // Male
            dgv.Rows[cell.RowIndex].DefaultCellStyle.BackColor = Color.White;
        }
        else
        {
            // Female
            dgv.Rows[cell.RowIndex].DefaultCellStyle.BackColor = Color.DarkGray;
        }
    }

ИЛИ ЖЕ:

    private void dataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
        DataGridView dgv = sender as DataGridView;

        if (dgv.Columns[e.ColumnIndex].Name.Equals("Gender"))
        {
            if (e.Value != null && e.Value.ToString().Trim() == "Male")
            {
                e.CellStyle.BackColor = Color.White;
            }
            else
            {
                e.CellStyle.BackColor = Color.DarkGray;
            }
        }

        //if (dgv.Rows[e.RowIndex].Cells["Gender"].Value.ToString().Trim() == "Male")
        //{
        //    e.CellStyle.BackColor = Color.White;
        //}
        //else
        //{
        //    e.CellStyle.BackColor = Color.DarkGray;
        //}
    }

Любые советы по этому вопросу помогут вам. Заранее спасибо.

2 ответа

Решение

Чтобы изменить цвет фона, вы должны подписаться на CellFormatting событие. Затем добавьте этот код в обработчик событий:

private void dataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    DataGridView dgv = sender as DataGridView;

    if (dgv.Columns[e.ColumnIndex].Name.Equals("Gender"))
    {
        if (e.Value != null && e.Value.ToString().Trim() == "Male")
        {
            dgv.Rows[e.RowIndex].Cells["name"].Style.BackColor = Color.White;
        }
        else
        {
            dgv.Rows[e.RowIndex].Cells["name"].Style.BackColor = Color.DarkGray;
        }
    }

}

Чтобы вызвать проверку, когда новое значение выбрано в вашем DataGridViewComboBoxCellподпишитесь на CurrentCellDirtyStateChanged событие и попробуйте этот код в его обработчике:

private void dataGridView_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    DataGridView dgv = sender as DataGridView;
    DataGridViewCell cell = dgv.CurrentCell;
    if (cell is DataGridViewComboBoxCell)
    {
        dgv.CommitEdit(DataGridViewDataErrorContexts.Commit);
        dgv.EndEdit();
    }
}

Просто чтобы показать вам рабочий пример, я изменяю ForeColor вместо Back, но концепция та же самая. Вам необходимо применить значение по умолчанию:

this.dgvUsers.DefaultCellStyle.ForeColor = Color.Black;

Затем, в зависимости от вашего триггера, вам нужно назначить обработчик:

dgvUsers.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.dgvUsers_CellFormatting);
this.Controls.Add(dgvUsers);

Затем для обработки события это будет выглядеть примерно так:

// Handle user going inactive or being reactivated
private void dgvUsers_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    DataRowView row = dgvUsers.Rows[e.RowIndex].DataBoundItem as DataRowView;
    if (row != null && row.Row.ItemArray[7].Equals("N"))
    {
        e.CellStyle.ForeColor = Color.Gray;
    }
    else
    {
        e.CellStyle.ForeColor = Color.Black;
    }
}

В отличие от принятого ответа, здесь используются стили, чтобы изменить определенные в одном месте.

Другие вопросы по тегам