2012-01-12 5 views
1

Мне нужно изменить цвет ячеек gridview на основе значения данных. Я могу с легкостью сделать это, используя представление datarow в событии Gridviews RowDataBound и инструкции if (см. Ниже), однако мне нужно сделать это на 30 столбцах, которые будут довольно длинными, и боль изменится при изменении бизнес-правил. Как я могу инкапсулировать следующее в метод многократного использования, который я могу вызвать и просто передать в столбце данных и индексе ячейки?Многоразовый метод изменения цвета ячейки сетки

protected void gv1_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.DataItem != null) 
     { 
      DataRowView drv = (DataRowView)e.Row.DataItem; 

      int A = Int32.Parse(drv["A"].ToString()); 
      if (A <= 74) 
      { 
       e.Row.Cells[2].BackColor = System.Drawing.Color.Red; 
      } 
     } 
    } 
+1

Я хотел бы посмотреть при создании перечисления цветов, которые должны быть установлены тогда на основе условий. замените system.Drawing.Color.Red на enum.color drv тоже нужно было бы изменить или потребовалось бы создать массив или список или перечислить, которые также могли бы определять, какие поля должны быть изменены. Даже если бы это было .config driven .. каковы некоторые из бизнес-правил, например .. ?? – MethodMan

ответ

2
public void SetColor(DataGridViewRow row, string columnName, int cellIndex) 
{ 
    var data = (GridViewRow)row.DataItem; 
    int number = Convert.ToInt32(data[columnName]); 
    if (number > 74) return; 

    row.Cells[cellIndex].BackColor = Color.Red; 
} 

protected void gv1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType != DataRowType.DataRow) return; 
    SetColor(e, "A", 2); 
} 
+0

Я бы добавил цвет как параметр к методу, по крайней мере, потому что это его имя;) –

+0

@TimSchmelter ther много, что можно сделать, чтобы реорганизовать этот код во что-то многоразовое. все зависит от того, сколько ожидается повторное использование. учитывая контекст сообщения и текущего кода, я понял, что это наиболее приемлемое решение. –

1

Фигурные это - мистер Meckley поставил меня на правильном пути и моей работы (если безвкусный) Решение:

public void SetColor2(GridViewRow row, string columnName, int cellIndex) 
    { 
     if (row.RowType == DataControlRowType.DataRow) 
     { 
      int number = Convert.ToInt32(columnName); 
      if (number == 0) 
      { 
       row.Cells[cellIndex].Text = ""; 
       return; 
      } 
      else if ((number > 0) && (number <= 74)) 
      { 
       row.Cells[cellIndex].BackColor = System.Drawing.Color.Red; 
       row.Cells[cellIndex].ForeColor = System.Drawing.Color.Black; 
       return; 
      } 
     } 
    } 

Использование:

protected void gv1_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.DataItem != null) 
     { 
      DataRowView drv = (DataRowView)e.Row.DataItem; 
      SetColor2(e.Row, drv["A"].ToString(), 2); 
      SetColor2(e.Row, drv["B"].ToString(), 3); 
      etc... 
     } 
    } 
Смежные вопросы