Как изменить цвет ячейки 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;
}
}
В отличие от принятого ответа, здесь используются стили, чтобы изменить определенные в одном месте.