2009-07-03 5 views
22

У меня есть datagridview, состоящий из нескольких строк и столбцов. Я хочу перебирать каждую строку и проверять содержимое определенного столбца. Если в этой колонке содержится слово «НЕТ», я хочу изменить цвет forecolor всей строки на красный. Вот попытка какого-то кода до сих пор, но это, конечно, не работает, начиная удивляться Если мне нужно перебирать каждую ячейку?C# Iterate Over DataGridView & Change Row Color

КОД:

foreach (DataGridViewRow dgvr in dataGridView1.Rows) 
     { 
      if (dgvr.Cells["FollowedUp"].Value.ToString() == ("No")) 
      { 
       dgvr.DefaultCellStyle.ForeColor = Color.Red; 
      } 
     } 
+1

Что такое "не работает"? Нет строк? ячейку нельзя найти? – Colin

ответ

5
public void ColourChange() 
    { 
     DataGridViewCellStyle RedCellStyle = null; 
     RedCellStyle = new DataGridViewCellStyle(); 
     RedCellStyle.ForeColor = Color.Red; 
     DataGridViewCellStyle GreenCellStyle = null; 
     GreenCellStyle = new DataGridViewCellStyle(); 
     GreenCellStyle.ForeColor = Color.Green; 


     foreach (DataGridViewRow dgvr in dataGridView1.Rows) 
     { 
      if (dgvr.Cells["FollowedUp"].Value.ToString().Contains("No")) 
      { 
       dgvr.DefaultCellStyle = RedCellStyle; 
      } 
      if (dgvr.Cells["FollowedUp"].Value.ToString().Contains("Yes")) 
      { 
       dgvr.DefaultCellStyle = GreenCellStyle; 
      } 
     } 
    } 
+10

Вы ничего не получаете, делая [Тип x = null; x = новый тип();]. Вы должны объединить эти две строки в [Type x = new Type();] –

25

крюк вверх OnRowDataBound событие затем делать вещи

ASPX (Сетка):

<asp:.... OnRowDataBound="RowDataBound"..../> 

Код За:

protected void RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowIndex == -1) 
     { 
      return; 
     } 

     if(e.Row.Cells[YOUR_COLUMN_INDEX].Text=="NO"){ 
      e.Row.BackColor=Color.Red; 
     } 
    } 

ДЛЯ WinForms:

hook the **DataBindingComplete** event and do stuff in it: 

    private void dataGridView1_DataBindingComplete(object sender, 
         DataGridViewBindingCompleteEventArgs e) 
    { 
     if (e.ListChangedType != ListChangedType.ItemDeleted) 
     { 
      DataGridViewCellStyle red = dataGridView1.DefaultCellStyle.Clone(); 
      red.BackColor=Color.Red; 

      foreach (DataGridViewRow r in dataGridView1.Rows) 
      { 
       if (r.Cells["FollowedUp"].Value.ToString() 
         .ToUpper().Contains("NO")) 
       { 
        r.DefaultCellStyle = red; 
       } 
      } 
     } 
    } 
+3

Извините, это просто приложение WinForms ......... – Goober

+1

oops! все так в сети, и я сам глубоко в веб-проекте с 3 месяцев, что кажется нормальным, что каждый вопрос о asp.net – TheVillageIdiot

+0

кто-то проголосовал и не знает почему? – TheVillageIdiot

2

Можно есть пробелы или какой-либо другой символ, как часть значения ячейки? Если да, попробуйте использовать метод Contains, а не прямое равенство.

if (dgvr.Cells["FollowedUp"].Value.ToString().Contains("No")) 
0

Это решение для Winforms:

private void HighlightRows() 
{ 
    DataGridViewCellStyle GreenStyle = null; 

    if (this.dgridv.DataSource != null) 
    { 
     RedCellStyle = new DataGridViewCellStyle(); 
     RedCellStyle.BackColor = Color.Red; 

     for (Int32 i = 0; i < this.dgridv.Rows.Count; i++) 
     { 
      if (((DataTable)this.dgridv.DataSource).Rows[i]["col_name"].ToString().ToUpper() == "NO") 
      { 
       this.dgridv.Rows[i].DefaultCellStyle = RedCellStyle; 
       continue; 
      } 
     } 
    } 
} 
+0

Нет Исключения и цвет не изменен. Я не знаю, зачем нужна помощь. –

0

Этот код прекрасно работает для меня:

 

foreach (DataGridViewRow row in dataGridView1.Rows) 
{ 
    if ((string)row.Cells["property_name"].Value == UNKNOWN_PROPERTY_NAME) 
    { 
     row.DefaultCellStyle.BackColor = Color.LightSalmon; 
     row.DefaultCellStyle.SelectionBackColor = Color.Salmon; 
    } 
} 
 

Другие, чем литье в виде строки, а не вызывать ToString я действительно не вижу какой-либо разница, поэтому это может быть ошибка чувствительности к регистру. Попробуйте использовать:

 
dgvr.Cells["FollowedUp"].Value.ToString().ToUpper() == "NO" 
9

На вашем DataGridView, обрабатывать событие CellFormatting:

dataGridView1.CellFormatting += new DataGridViewCellFormattingEventHandler(dataGridView1_CellFormatting); 

Ваш обработчик событий может выглядеть следующим образом:

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{  
    if(dataGridView1.Columns[e.ColumnIndex].Name == "FollowedUp" && e.Value != null && e.Value.ToString() == "No") 
     dataGridView1.Rows[e.RowIndex].DefaultCellStyle.ForeColor = Color.Red; 
} 

Таким образом, вы Арен 't' итерирование 'по строкам - просто изменение цвета, с которым они окрашиваются/рисуются, когда они становятся видимыми (и, следовательно, повторно форматирование запроса) в сетке.

+0

Этот метод медленнее LOT, но форматирование не уничтожается сортировкой кликов заголовка столбца. –

+0

Простите, что-то не так с моей заменой кода обработчика событий, и я не могу редактировать свой предыдущий комментарий. Я бы заменил «LOT» на «несколько» медленнее. –

+0

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

0
private void Grd_Cust_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    colorCode == 4 ? Color.Yellow : Color.Brown; 
    if (e.RowIndex < 0 || Grd_Cust.Rows[e.RowIndex].Cells["FollowedUp"].Value == DBNull.Value) 
     return; 
    string colorCode = Grd_Cust.Rows[e.RowIndex].Cells["FollowedUp"].Value.ToString(); 
    e.CellStyle.BackColor = colorCode == "NO" ? Color.Red : Grd_Cust.DefaultCellStyle.BackColor; 
} 
+1

Добро пожаловать в stackoverflow. Совет. Вы можете использовать кнопку '{}' для форматирования фрагментов кода. – Leigh