Настройка цветов DataGridView

Все исходники /  Язык программирования C# /  OS Windows /  Базы данных - Database /  SQL Server / Настройка цветов DataGridView

Важность цветового оформления

Цвета строк, ячеек и столбцов DataGridView

Немаловажную роль для комфорта работы с приложением играет цветовая гамма таблиц, отображаемых элементом управления DataGridView. Приятные цвета способствуют повышению производительности труда. Темные темы для DataGridView снижают нагрузку на зрение при длительной работе с приложением управления баз данных. Создавая программы необходимо учитывать индивидуальные цветовые предпочтения разных пользователей.

Цвета необходимы также для акцентирования внимания на редактируемой части таблицы. В процессе работы с визуализированными таблицами базы данных может потребоваться выделение отдельным цветом любого компонента DataGridView: строки, столбца, ячейки и других составляющих. Исходник приложения содержит один из способов создания цветовой гаммы таблиц данных, с возможностями выделения любой строки, столбца или ячейки. Пример построен на программе управления базой данных с помощью DataGridView.

Цветовые компоненты DataGridView

Элемент визуального отображения таблиц в своем составе содержит внушительный список стилей-компонентов, каждый из которых может хранить информацию о своём цвете. Все стили относятся к классу DataGridViewCellStyle.

Стили и свойства DataGridView, описываются только цветовые качества:
  • DataGridView.BackgroundColor - цвет фона элемента, когда высота таблицы с данными меньше высоты самого элемента DataGridView.
  • DataGridView.ForeColor - цвет шрифта ячеек таблицы
  • DataGridView.GridColor - цвет линий таблицы
  • DataGridView.DefaultCellStyle - цвет и другие настройки вида ячеек таблицы. Самый "слабый" стиль, настройки стилей строк, столбцов и ячеек переопределяют данное свойство.
  • DataGridView.RowsDefaultCellStyle - цвет строк, переопределяет значения DataGridView.DefaultCellStyle.
  • DataGridView.AlternatingRowsDefaultCellStyle - цвет нечетных строк таблицы. Переопределяет все стили, кроме DataGridViewRow.DefaultCellStyle и DataGridViewCell.Style
  • DataGridViewColumn.DefaultCellStyle - цвет ячеек столбца. Переопределяется всеми стилями, кроме DataGridView.DefaultCellStyle.
  • DataGridViewRow.DefaultCellStyle - цвет строки, хранит свои настройки независимо от родительского DataGridView. Переопределяет все стили, кроме DataGridViewCell.Style.
  • DataGridViewCell.Style - цвет ячейки, переопределяет все стили.
  • DataGridView.ColumnHeadersDefaultCellStyle - цвет заголовков столбцов, при DataGridView.EnableHeadersVisualStyles = false.
  • DataGridView.RowHeadersDefaultCellStyle - цвет заголовков строк, при DataGridView.EnableHeadersVisualStyles = false.

Цвета заголовков столбцов и строк

Заголовки строк и столбцов обычно выделяются более темным цветом, чем ячейки. Если свойство DataGridView.EnableHeadersVisualStyles=true - для заголовков используются цвета текущей темы операционной системы. Чтобы раскрасить заголовки таблицы элемента DataGridView в собственные цвета, необходимо отключить визуальные стили: DataGridView.EnableHeadersVisualStyles=false.

Для примера показан код метода зелёной темы:
public void GreenStyle()
{
    // Предварительный сброс цветов предыдущей темы.
    ResetColors();
    ResetFormColor();

    // === Настройка стиля  формы ===

    _menustrip.BackColor = Color.FromArgb(152, 230, 152);
    _menustrip.ForeColor = Color.Black;

    _form.BackColor = Color.FromArgb(30, 123, 30);
    _form.ForeColor = Color.White;

    foreach (GroupBox grp in _gbxs)
    {
        grp.ForeColor = Color.White;
    }

    // === Настройка стиля  таблиц элементов DataGridView ===    

    foreach (DataGridView dgv in _dgvs)
    {
        // Цветовая гамма для выделения ячеек.
        dgv.DefaultCellStyle.SelectionBackColor = Color.FromArgb(0, 128, 255);
        dgv.DefaultCellStyle.SelectionForeColor = Color.White;

        // Цвета ячеек по умолчанию.
        dgv.DefaultCellStyle.BackColor = Color.White;
        dgv.DefaultCellStyle.ForeColor = Color.Black;

        // Цвета нечетных строк.
        dgv.AlternatingRowsDefaultCellStyle.BackColor = Color.FromArgb(174, 239, 174);
        dgv.AlternatingRowsDefaultCellStyle.ForeColor = Color.Black;

        // Окраска в одинаковый цвет заголовок столбцов и строк.
        dgv.ColumnHeadersDefaultCellStyle.BackColor =
            dgv.RowHeadersDefaultCellStyle.BackColor = Color.FromArgb(20, 82, 20);
        dgv.ColumnHeadersDefaultCellStyle.ForeColor =
            dgv.RowHeadersDefaultCellStyle.ForeColor = Color.White;

        // Фоновый цвет самого DataGridView
        dgv.BackgroundColor = Color.FromArgb(10, 41, 10);
        // Временно сбрасываем выделения всех ячеек.
        dgv.ClearSelection(); 
    }
}

Чередование цветов строк

Облегчает восприятие данных в таблицах методика чередования цветов строк. Данный способ существенно повышает концентрацию внимания глаз на выбранной строке. В элементе отображения таблиц DataGridView Windows Forms уже заложена возможность автоматического окрашивания нечетных строк. Для этого достаточно только определить свойство альтернативного стиля - AlternatingRowsDefaultCellStyle, остальное берёт на себя внутренняя логика элемента отображения таблиц.

Определение альтернативного цвета нечетных строк неэффективно при установленных стилях строк DataGridViewRow.DefaultCellStyle или ячеек DataGridViewCell.Style. Применение чередование цветов строк показано анимационной картинкой интерфейса приложения.

Определение сочетания цвета фона и шрифта для нечетных строк таблицы:
// Цвета нечетных строк.
dgv.AlternatingRowsDefaultCellStyle.BackColor = Color.FromArgb(174, 239, 174);
dgv.AlternatingRowsDefaultCellStyle.ForeColor = Color.Black;

Выделение столбца цветом

Для выделения выбранного столбца одним цветом используется экземпляр класса DataGridViewColumn входящий в состав коллекции столбцов DataGridView.Columns. При назначении стиля столбцов необходимо учитывать, что DataGridViewRow.DefaultCellStyle не может переопределить стили AlternatingRowsDefaultCellStyle, DataGridViewRow.DefaultCellStyle, DataGridViewCell.Style. Посмотреть окрашенные столбцы можно в анимации цветовых стилей приложения вначале страницы.

Метод окрашивания в разные цвета всех столбцов таблицы:
public void ColumnStyle()
{
    // Предварительный сброс цветов.
    ResetColors();

    // Гамма цветов для столбцов.
    Color[] colors = { Color.LightCoral, Color.LightGreen,
        Color.LightBlue, Color.Yellow, Color.Orange, Color.Aqua };
    foreach (DataGridView dgv in _dgvs)
    {
        int count = 0;
        foreach (DataGridViewColumn column in dgv.Columns)
        {
            // Каждый столбец окрашивается в свой цвет.
            column.DefaultCellStyle.BackColor = colors[count];
            count++;
        }
        // Сброс выделения для рассматривания цветов.
        dgv.ClearSelection();
    }
}

Цветные строки DataGridView

Строки окрашиваются подобно столбцам: коллекция DataGridView.Rows содержит ссылки на все строки отображаемой таблицы в виде экземпляров класса DataGridViewRow. Каждый экземпляр имеет собственный стиль DefaultCellStyle, благодаря этому можно окрасить фон любой строки в индивидуальный цвет.

Метод создания разноцветных строк:
public void RowStyle()
{
    // Сброс цветовых настроек к по умолчанию.
    ResetColors();

    Color[] colors = { Color.LightCoral, Color.LightGreen,
        Color.LightBlue, Color.Yellow, Color.Orange, Color.Aqua };
    foreach (DataGridView dgv in _dgvs)
    {
        // Счётчик цветов.
        int count = 0;
        foreach (DataGridViewRow row in dgv.Rows)
        {
            // Каждая строка в свой цвет.
            row.DefaultCellStyle.BackColor = colors[count];
            _ = count < 5 ? count++ : count = 0;
        }
        dgv.ClearSelection();
    }
}

Назначение цвета ячейке таблицы

Ячейками элемента управления DataGridView владеют строки коллекции DataGridView.Rows. В свою очередь отдельная строка имеет коллекцию ячеек DataGridViewRow.Cells. Отдельную ячейку представляет класс DataGridViewCell, имеющий в своём составе свойство Style типа DataGridViewCellStyle.

DataGridViewCell.Style - самый "сильный" стиль и переопределяет все стили-компоненты в составе DataGridView. Если ячейке назначить цвет, то перекрасить его не сможет ни один стиль.

Метод закраски ячеек разными цветами в шахматном порядке. Результат наглядно показывает анимация цветовых стилей выше.
public void CellStyle()
{
    ResetColors();

    Color[] colors = { Color.LightCoral, Color.LightGreen,
        Color.LightBlue, Color.Yellow, Color.Orange, Color.Aqua };
    foreach (DataGridView dgv in _dgvs)
    {
        foreach (DataGridViewRow row in dgv.Rows)
        {
            int count = 0;
            foreach (DataGridViewCell cell in row.Cells)
            {
                cell.Style.BackColor = colors[count];
                _ = count < colors.Length - 1 ? count++ : count = 0;
            }
            Array.Reverse(colors);
        }

        dgv.ClearSelection();
    }
}

Сброс всех стилей к по умолчанию

Стили DataGridView имеют разные веса и могут переопределять другие назначенные стили. Например, определение DataGridViewCell.Style скрывает настройки всех других стилей. При создании приложения с настройками различных цветовых тем необходимо предусмотреть создание метода сброса всех стилей перед назначением нового.

Сброс стилей можно осуществить несколькими способами, в приложении созданы 3 метода сброса стилей. Два из них сбрасывают цветовые настройки теме операционной системы, третий метод необходим для возвращения к собственному стилю.

Первый способ предусматривает обнуление стилей, например: column.DefaultCellStyle = null. В таком случае в объекте DataGridView заново пересоздаются стили для текущей темы операционной системы. Сбрасываются все параметры: цвет фона, настройки шрифта и другие. Данный способ наиболее эффективный и правильный для восстановления вида элементов datGridView к настройке по умолчанию. Данный способ работает в приложении при значении глобальной Global.DefaultFormColors = 0.

Второй способ предполагает создание новых объектов стилей без настроек и присвоение их соответствующим стилям. Настройки по умолчанию новых объектов стилей могут отличаться от настроек элементов, которые были созданы при запуске приложения. Некоторый эффект несовпадения стилей новых объектов и тех которые создались при запуске приложения можно увидеть при нажатии кнопки меню default, выбрав значение глобальной переменной Global.DefaultFormColors = 1.

Сброс установленных стилей к теме по умолчанию установленной операционной системой:
// Первый способ
private void DefaultStyle0()
{
    ResetFormColor();

    foreach (DataGridView dgv in _dgvs)
    {
        DataGridView dataGridView = new();
        // Не может быть null
        dgv.BackgroundColor = dataGridView.BackgroundColor;

        // Обнуление стилей, после этого 
        // они пересоздаются автоматически.
        dgv.DefaultCellStyle = null;
        dgv.AlternatingRowsDefaultCellStyle = null;
        dgv.ColumnHeadersDefaultCellStyle = null;
        dgv.RowHeadersDefaultCellStyle = null;
        // Обнуление стилей строк, столбцов и ячеек.
        foreach (DataGridViewRow row in dgv.Rows)
        {
            row.DefaultCellStyle = null;
            foreach (DataGridViewColumn column in dgv.Columns)
            {
                column.DefaultCellStyle = null;
            }

            foreach(DataGridViewCell cell in row.Cells)
            {
                cell.Style = null;
            }
        }
    }
}

// Второй способ
private void DefaultStyle1()
{
    ResetFormColor();


    foreach (DataGridView dgv in _dgvs)
    {
        DataGridView dataGridView = new();
        dgv.DefaultCellStyle = dataGridView.DefaultCellStyle;
        dgv.AlternatingRowsDefaultCellStyle = dataGridView.AlternatingRowsDefaultCellStyle;
        dgv.ColumnHeadersDefaultCellStyle = dataGridView.ColumnHeadersDefaultCellStyle;
        dgv.RowHeadersDefaultCellStyle = dataGridView.RowHeadersDefaultCellStyle;
        dgv.BackgroundColor = dataGridView.BackgroundColor;

        foreach (DataGridViewRow row in dgv.Rows)
        {
            row.DefaultCellStyle = new();

            foreach (DataGridViewColumn column in dgv.Columns)
            {
                column.DefaultCellStyle = new();
            }

            foreach (DataGridViewCell cell in row.Cells)
            {
                cell.Style = new();
            }
        }
    }
}

Сброс стиля к установленным цветам

Если приложение имело собственные цветовые настройки, то первые два способа (см. выше) не дадут ожидаемого результата. Возврат элементов Windows Form к заводским настройкам отменит установленную для приложения цветовую схему. В таком случае имеется только один выход: после установки выбранной темы приложения сохранить настройки в оперативной памяти или файле. А при вызове метода сброса восстановить сохранённую собственную цветовую схему по умолчанию.

В приложении данный способ активируется значением глобальной переменной выбора способа сброса Global.DefaultFormColors = 2. Этот способ требует глубокое копирование параметров установленного стиля для элементов DataGridView.

Программный код метода глубокого копирования установленных параметров стилей и метода восстановления собственных цветовых настроек приложения:
// Группа сохранения заказных цветов по умолчанию.
private static readonly List _defStyles = new();
private static readonly List _defAltStyles = new();
private static readonly List _defColumnStyles = new();
private static readonly List _defRowStyles = new();
private static readonly List _defDvgBackgroundColors = new();
private static bool _init = false;

// Конструктор набора стилей.
public ColorSet(List dgvs, List gbxs, Form form, MenuStrip menustrip)
{
    _dgvs = dgvs;
    _gbxs = gbxs;
    _form = form;
    _menustrip = menustrip;

    // Однократная инициализация статических членов.
    // Сохранение настроек заказных цветов в оперативной памяти.
    if (_init == false)
    {
        // Глубокое копирование свойств стилей.
        for (int i = 0; i < _dgvs.Count; i++)
        {
            _defDvgBackgroundColors.Add(new Color());
            _defDvgBackgroundColors[i] = _dgvs[i].BackColor;

            _defStyles.Add(new DataGridViewCellStyle());
            _defStyles[i].BackColor = _dgvs[i].DefaultCellStyle.BackColor;
            _defStyles[i].ForeColor = _dgvs[i].DefaultCellStyle.ForeColor;

            _defAltStyles.Add(new DataGridViewCellStyle());
            _defAltStyles[i].BackColor = 
                _dgvs[i].AlternatingRowsDefaultCellStyle.BackColor;
            _defAltStyles[i].ForeColor = 
                _dgvs[i].AlternatingRowsDefaultCellStyle.ForeColor;

            _defColumnStyles.Add(new DataGridViewCellStyle());
            _defColumnStyles[i].BackColor = 
                _dgvs[i].ColumnHeadersDefaultCellStyle.BackColor;
            _defColumnStyles[i].ForeColor = 
                _dgvs[i].ColumnHeadersDefaultCellStyle.ForeColor;

            _defRowStyles.Add(new DataGridViewCellStyle());
            _defRowStyles[i].BackColor = 
                _dgvs[i].ColumnHeadersDefaultCellStyle.BackColor;
            _defRowStyles[i].ForeColor = 
                _dgvs[i].ColumnHeadersDefaultCellStyle.ForeColor;
        }

        _init = true;
    }
}

. . . . . . . . . .

private void DefaultStyle2()
{
    ResetFormColor();

    for (int i = 0; i < _dgvs.Count; i++)
    {
        foreach (DataGridViewRow row in _dgvs[i].Rows)
        {
            row.DefaultCellStyle = null;
            foreach (DataGridViewColumn column in _dgvs[i].Columns)
            {
                column.DefaultCellStyle = null;
            }

            foreach (DataGridViewCell cell in row.Cells)
            {
                cell.Style = null;
            }
        }

        _dgvs[i].BackgroundColor = _defDvgBackgroundColors[i];

        _dgvs[i].DefaultCellStyle.BackColor = _defStyles[i].BackColor;
        _dgvs[i].DefaultCellStyle.ForeColor = _defStyles[i].ForeColor;

        _dgvs[i].AlternatingRowsDefaultCellStyle.BackColor = _defAltStyles[i].BackColor;
        _dgvs[i].AlternatingRowsDefaultCellStyle.ForeColor = _defAltStyles[i].ForeColor;

        _dgvs[i].ColumnHeadersDefaultCellStyle.BackColor = _defColumnStyles[i].BackColor;
        _dgvs[i].ColumnHeadersDefaultCellStyle.ForeColor = _defColumnStyles[i].ForeColor;

        _dgvs[i].RowHeadersDefaultCellStyle.BackColor = _defRowStyles[i].BackColor;
        _dgvs[i].RowHeadersDefaultCellStyle.ForeColor = _defRowStyles[i].ForeColor;
    }
}

Скачать исходник