2016-09-27 5 views
3

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

enter image description here

Я хотел бы:

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

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

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

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

Любые советы на них будет большим подспорьем. Заранее спасибо.

+0

Посмотрите на [Событие CellFormatting] (https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.cellformatting (v = vs.110) .aspx). Пример может помочь вам сделать то, что вы хотите – Pikoh

+0

[This] (http://stackoverflow.com/questions/39540935/for-a-windows-forms-application-using-datagridview-how-can-i-check-a-value -in/39541363 # 39541363) может быть полезно. – Berkay

+0

Благодарим вас за ответ. Я не использую 'DataTable', который использовал DataGridViewRow' для отображения данных, а затем как? Извините, что я новичок C# – MinhKiyo

ответ

3

Чтобы изменить цвет фона, вы должны подписаться на событие 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(); 
    } 
} 
+0

Да, это именно то, что я хотел запустить. Спасибо за ваши усилия! – MinhKiyo

0

Чтобы показать вам рабочий пример, я меняю 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; 
    } 
} 

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

Смежные вопросы