2016-03-31 4 views
3

Возможно ли цветная ячейка datagridview на основе нескольких условий. Я знаю, что я могу изменить цвет ячеек на основе этого значения ячейки. но возможно ли добавить условие, когда я также могу применить цвет, основанный на смежном значении ячейки.C# Datagridview (Winform) раскраска ячеек на основе смежного значения ячейки

Чтобы сравнить дату ячейки с текущей датой, я воспользовался приведенным ниже кодом.

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    if (dataGridView1.Columns[e.ColumnIndex].Name == "ACTION PROPOSED DATE") 
    { 
     if (e.Value == null || e.Value == System.DBNull.Value || e.ColumnIndex < 0 || e.RowIndex < 0) 
     { 
      return; 
     } 
     else 
     { 
      if (((DateTime) e.Value).Date < (DateTime) DateTime.Now.Date) 
      { 
       e.CellStyle.BackColor = Color.Red; 
       e.CellStyle.ForeColor = Color.White; 
      } 
     } 
    } 
    // This section change the color of action proposed description column cell. 
    // i want to change the color in "ACTION PROPOSED DATE"column, if "ACTION PROPOSED DESCRIPTION" contains file closed 
    else if (dataGridView1.Columns[e.ColumnIndex].Name == "ACTION PROPOSED DESCRIPTION") 
    { 
     if (e.Value == null || e.Value == System.DBNull.Value || e.ColumnIndex < 0 || e.RowIndex < 0) 
     { 
      return; 
     } 
     else 
     { 
      string stringvalue = (string) e.Value; 
      stringvalue = stringvalue.ToLower(); 
      if ((stringvalue.IndexOf("file closed") > -1)) 
      { 
       e.CellStyle.BackColor = Color.Purple; 
      } 
     } 
    } 
} 

Я хочу, чтобы изменить цвет в «ПРЕДЛАГАЕМЫЕ ДЕЙСТВИЯ ДАТА» колонке ячейки до пурпурного, если «ПРЕДЛАГАЕМЫЕ ДЕЙСТВИЯ ОПИСАНИЕ» содержит «файл закрыт»

это результат я получаю в DataGridView

present output

это результат я жду

expected result

Прежде чем отправлять сообщения, у меня много googled, но я не нашел ответа на свой вопрос. Поэтому я надеюсь, что не повторил этот вопрос.

+0

Пожалуйста, форматировать код –

ответ

2

В арг события CellFormatting события указать, какие ячейки форматируемого. Но вы можете использовать другие ячейки, чтобы определить как для форматирования этой ячейки.

Например, чтобы достичь своей цели, вы можете использовать что-то вроде этого:

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    if (e.ColumnIndex < 0 || e.RowIndex < 0) return; 
    if (dataGridView1.Columns[e.ColumnIndex].Name == "ACTION PROPOSED DATE") 
    { 
     // Take the other column value for the same row 
     var proposedDescription = dg.Rows[e.RowIndex].Cells["ACTION PROPOSED DESCRIPTION"].Value as string; 
     if (proposedDescription != null && proposedDescription.IndexOf("file closed", StringComparison.CurrentCultureIgnoreCase) >= 0) 
     { 
      e.CellStyle.BackColor = Color.Purple; 
      return; 
     } 
     if (e.Value == null || e.Value == System.DBNull.Value || e.ColumnIndex < 0 || e.RowIndex < 0) 
     { 
      return; 
     } 
     else 
     { 
      if (((DateTime) e.Value).Date < (DateTime) DateTime.Now.Date) 
      { 
       e.CellStyle.BackColor = Color.Red; 
       e.CellStyle.ForeColor = Color.White; 
      } 
     } 
    } 
} 
+0

спасибо, это тоже работает :) – princeton

1

Вы можете просто изменить эту строку кода

e.CellStyle.BackColor = Color.Purple; 

в

// Note i did change the column name of ACTION PROPOSE DATE 
// due to syntax property naming rules. 
dataGridView1["ACTION_PROPOSED_DATE", e.RowIndex].Style.BackColor = Color.Purple 

Вы должны изменить это также:

else if (dataGridView1.Columns[e.ColumnIndex].Name == "ACTION PROPOSED DESCRIPTION") 

в

if (dataGridView1.Columns[e.ColumnIndex].Name == "ACTION PROPOSED DESCRIPTION") 

что ваша программа не пропустит проверку вашего предложенного столбца.

Вы можете добавить условие, что будет также проверить, если соседнее значение ячейки файл закрылся ниже этой линии кодов:

if (((DateTime) e.Value).Date < (DateTime) DateTime.Now.Date) 
{ 
    e.CellStyle.BackColor = Color.Red; 
    e.CellStyle.ForeColor = Color.White; 
} 

и сделать текущий цвет ячейки в фиолетовый цвет. Для того, чтобы сделать что пишет этот код:

if (dataGridView1["ACTION_PROPOSED_DESCRIPTION", e.RowIndex].Value.ToString() == "File Closed") 
{ 
    dataGridView1["ACTION_PROPOSED_DATE", e.RowIndex].Style.BackColor = Color.Purple; 
} 
+0

Ваше предложение работал. Я получаю ожидаемые результаты без изменения имени столбца. Спасибо за помощь. Но когда дата меньше текущей даты, а соседний столбец «закрыт», ячейка получает красный цвет. Он должен быть фиолетовым. ты можешь помочь мне с этим?? Спасибо. – princeton

+0

Вы можете удалить инструкцию 'else' в вашем else if? поэтому программа будет постоянно проверять форматированное значение ячейки – Roelzkie

+0

привет, я сделал, как вы сказали. все еще без изменений ..Я также изменяю порядок, думая, что он будет работать, как приоритет условного форматирования excel. – princeton

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