Разные цветные строки в DataGridView (DGV)

#c# #datagridview #row #match

#c# #datagridview #строка #совпадение

Вопрос:

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

Поэтому я бы хотел, чтобы все строки по умолчанию были черными с белым текстом, за исключением любой строки, в которой указанный столбец равен FUJI/UNIVERSAL . Для этой строки я бы хотел, чтобы она была желтой с черным текстом.

Итак, мой вопрос … возможно ли это? и если да, то как?

Ответ №1:

Ответ №2:

Например, путем обработки OnCellFormatting события.

Вот фактический фрагмент кода из моего старого хобби-проекта WinForms, который делает именно это. Это также снова учит меня тому, насколько важно комментировать (нет шансов, что я все еще помню это сейчас).

Я уверен, что вы можете адаптировать его к своим целям.

     private void sheetCalendar_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
        if (CurrentRota == null)
        {
            return;
        }
        /* A word of explanation is needed. We retrieve the DataGridView from sender
         * and we access the cell in question directly. 
         * MSDN advices against it -
         * "to avoid performance penalties When handling this event,
         * access the cell through the parameters of the event handler
         * rather than accessing the cell directly."
         * 
         * The problem is that we don't want to set the same colour to the same cell
         * over and over again.
         * And e.CellStyle always "forgets" what colour the call had had! */
        var dgrid = sender as DataGridView;
        var _col = e.ColumnIndex; 
        var _row = e.RowIndex; 
        var _highlight = (((Rota) sheetCalendar.Rows[e.RowIndex].DataBoundItem).Monday ==
                          CurrentRota.Monday);
        var color = _highlight ?
                                   Settings.Default.DGRIDCalendar_CurrentlyEditedBackColor :
                                                                                               SystemColors.Window;
        if (dgrid[_col, _row].Style.BackColor != color)
            dgrid[_col, _row].Style.BackColor = color;

    }
  

Ответ №3:

Обработайте событие OnPaint для элемента DataGridView управления.

Выполните синтаксический анализ строк и задайте цвет для строк, содержащих искомую информацию.

Некоторый пример кода:

 int specificColumnIndex = 5;
const string FUJIUNIV = "FUJI/UNIVERSAL";
const Color cFUJIBACK = Color.Yellow;
const Color cFUJITEXT = Color.Black;

public Form1() {
  InitializeComponent();
  dataGridView1.Paint  = new PaintEventHandler(DataGridView_Paint);
}

private void DataGridView_Paint(object sender, PaintEventArgs e) {
  foreach (DataGridViewRow row in dataGridView1.Rows) {
    if (row.Cells[specificColumnIndex].Value.ToString() == FUJIUNIV) {
      foreach (DataGridViewCell cell in row.Cells) {
        cell.Style.BackColor = cFUJIBACK;
        cell.Style.ForeColor = cFUJITEXT;
        cell.Style.SelectionBackColor = Color.Gold;
      }
    }
  }
}
  

}