2015-01-20 2 views
0

Я создаю программу, которая использует DataGridView для редактирования записей в базе данных SQL. Мой менеджер проектов требует, чтобы строки были зелеными, желтыми или красными в зависимости от того, были ли они вставлены, обновлены или помечены для удаления во временном окне. Он также хочет, чтобы колонка использовала для сортировки цветного светло-серого цвета DataGridView. Чтобы справиться с этим, я создал следующие обработчики событий в моей форме:Раскраски строк перед столбцами в DataGridView

private void OnRowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) 
    { 
     //get the row 
     DataRow row = ((DataRowView)this.dataGridView.Rows[e.RowIndex].DataBoundItem).Row; 

     //color the row 
     try 
     { 
      //REDACTED 
      //gets booleans used below 
      //REDACTED 

      if (softDeleted) 
       this.dataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.FromArgb(255, 213, 91, 95); //red 
      else if (inserted) 
       this.dataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.FromArgb(255, 83, 223, 146); //green 
      else if (updated) 
       this.dataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.FromArgb(255, 234, 218, 106); //yellow 
      else 
       this.dataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Empty; 
     } 
     //on failure, abort coloring 
     catch(Exception ex) 
     { 
      MessageBox.Show("Unable to get data required for coloring - " + ex.Message + ".\n Coloring disabled."); 
      Logging.logException(ex); 
      this.dataGridView.RowPrePaint -= OnRowPrePaint; 
     } 
    } 
    private void OnSorted(object sender, EventArgs e) 
    { 
     //remove color from previous sort column and add to new 
     if (this.mLastSortColumnIndex != -1) 
     { 
      this.dataGridView.Columns[this.mLastSortColumnIndex].DefaultCellStyle.BackColor = Color.Empty; 
     } 
     this.mLastSortColumnIndex = this.dataGridView.SortedColumn.Index; 
     this.dataGridView.SortedColumn.DefaultCellStyle.BackColor = Color.LightGray; 
    } 

Это прекрасно работает, и я очень счастлива с ним! Или было, пока мой руководитель проекта не настаивал на том, что цвет сортировки (раскраска столбцов) переопределяет окраску строк. Мои попытки все встретились с провалом - есть ли способ снять это с чистого листа?

Иллюстрация ниже - текущий слева, желательно справа. Illustration

ответ

1

добавить обработчик CellPainting событие

void OnGridCellPainting(object sender, System.Windows.Forms.DataGridViewCellPaintingEventArgs e) 
{ 
    if (e.RowIndex >= 0 && e.ColumnIndex == mLastSortColumnIndex) 
     e.CellStyle.BackColor = Color.LightGray; 
} 

этот метод установлен LightGray цвета для ячеек в отсортированном столбце после RowPrePaint

+0

Я понятия не имею, как я пропустил это событие при поиске на API для возможных исправлений. .. Работает как шарм; Спасибо! – Conduit

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