DataGridView изменить фон ячеек и восстановить стиль по умолчанию - PullRequest
0 голосов
/ 25 мая 2018

В моем DGV после нажатия на ячейку я хочу изменить цвет фона всех ячеек одного и того же столбца на некоторое значение.После нажатия на другую ячейку предыдущая ячейка (и весь ее столбец) должна восстановить стиль по умолчанию

        int    currCell = dgvLogHeader.CurrentCell.ColumnIndex;
        string pattern = dgvLogHeader.CurrentCell.Value.ToString();
        dgvLogHeader.AlternatingRowsDefaultCellStyle.BackColor = SystemColors.ScrollBar;
        dgvLogHeader.DefaultCellStyle.BackColor = SystemColors.Info;

        for (int j=0; j < dgvLogHeader.Rows.Count; j++ ) {
            //dgvLogHeader.Columns[currCell].
            if (dgvLogHeader.Rows[j].Cells[currCell].Value.ToString() == pattern) {
                dgvLogHeader.Rows[j].Cells[currCell].Style.BackColor = Color.Brown;
            }
        }

Но после этого ячейки изменили фон, и стиль по умолчанию потерян.

1 Ответ

0 голосов
/ 28 мая 2018

Это один из способов сделать это:

private void dgvLogHeader_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    foreach (DataGridViewColumn col in dgvLogHeader.Columns)
    {
        if (col.DefaultCellStyle.BackColor != Color.Empty)
            col.DefaultCellStyle.BackColor = Color.Empty;
    }
    dgvLogHeader.Columns[e.ColumnIndex].DefaultCellStyle.BackColor = Color.Gainsboro;
}

Сначала каждый столбец сбрасывается с цветом по умолчанию (Color.Empty), а затем окрашивает текущий столбец.

Обратите внимание, чтоэто не приведет к сбросу любых цветов, которые вы установили в отдельных ячейках !

Сброс тех, что вам необходимо установить, на Color.Empty.

Вы можете добавить

dgvLogHeader.ClearSelection();

, чтобы очистить выделенную ячейку, на которую щелкнули.

Но : если вам нужно выбрать цвета на индивидуальной основе, в зависимости от значений ячейки, товам придется ездить на велосипеде по клеткам.Лучше всего это делать в событии CellPainting, так как оно вызывается оптимизированным образом, чтобы включить только показанные ячейки.Обратите внимание, что он вызывается для каждой ячейки, поэтому вам нужно учитывать значения e.ColumnIndex и e.RowIndex.

Обновление: Теперь вы уже прояснили вопросвам нужно зациклить все или все видимые ячейки.

Вот функция, которую вы можете вызвать, чтобы сделать это:

private void markCells(DataGridView dgv, string pattern)
{
    dgv.SuspendLayout();

    foreach (DataGridViewRow row in dgv.Rows)
        foreach (DataGridViewCell cell in row.Cells)
            cell.Style.BackColor = cell.Value.ToString() == pattern ?
                Color.LightBlue : Color.Empty;
    dgv.ResumeLayout();
    //dgv.ClearSelection()
}

Если быстро проходит через весь DGV;Вы можете вызвать его, например, из события Textbox.TextChange.

При установке цветов приостанавливается макет, поэтому он должен быть быстрым и без мерцания.

Если вы хотите искать только в одномВ столбец можно добавить дополнительное условие, например, вот так:

cell.Style.BackColor = cell.Value.ToString() == pattern &&  
                       cell.ColumnIndex == dgv.CurrentCell.ColumnIndex?

, а также поместить его в CellClick событие

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...