it-swarm.com.ru

Динамическое изменение цвета ячейки в datagridview

У меня есть объект dataGridView, который заполняется данными. Я хочу нажать кнопку, чтобы она поменяла цвет фона ячейки. Это то, что у меня сейчас есть

foreach(DataGridViewRow row in dataGridView1.Rows)
{
    foreach(DataGridViewColumn col in dataGridView1.Columns)
    {
            //row.Cells[col.Index].Style.BackColor = Color.Green; //doesn't work
            //col.Cells[row.Index].Style.BackColor = Color.Green; //doesn't work
        dataGridView1[col.Index, row.Index].Style.BackColor = Color.Green; //doesn't work
    }
} 

ВСЕ из этих трех приводят к тому, что таблица перерисовывается сама по себе, и попытка изменить размер таблиц становится беспорядком. при нажатии на ячейку значение остается выделенным, а фоновый цвет не изменяется. 

В: Как я могу изменить задний цвет отдельной ячейки после того, как таблица существует?

20
fifamaniac04

Это работает для меня

dataGridView1.Rows[rowIndex].Cells[columnIndex].Style.BackColor = Color.Red;
56
Ehsan

Реализуйте свое собственное расширение DataGridViewTextBoxCell и переопределите метод Paint следующим образом:

class MyDataGridViewTextBoxCell : DataGridViewTextBoxCell
{
    protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex,
        DataGridViewElementStates cellState, object value, object formattedValue, string errorText,
        DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
    {
        if (value != null)
        {
            if ((bool) value)
            {
                cellStyle.BackColor = Color.LightGreen;
            }
            else
            {
                cellStyle.BackColor = Color.OrangeRed;
            }
        }
        base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value,
            formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
}

}

Затем в коде установите свойство CellTemplate вашего столбца для экземпляра вашего класса

columns.Add(new DataGridViewTextBoxColumn() {CellTemplate = new MyDataGridViewTextBoxCell()});
3
Pavel

Спасибо работает 

здесь я сделал с этим по полю кол-во ноль означает, что это показывает, что ячейки в красный цвет

        int count = 0;

        foreach (DataGridViewRow row in ItemDg.Rows)
        {
            int qtyEntered = Convert.ToInt16(row.Cells[1].Value);
            if (qtyEntered <= 0)
            {
                ItemDg[0, count].Style.BackColor = Color.Red;//to color the row
                ItemDg[1, count].Style.BackColor = Color.Red;

                ItemDg[0, count].ReadOnly = true;//qty should not be enter for 0 inventory                       
            }
            ItemDg[0, count].Value = "0";//assign a default value to quantity enter
            count++;
        }

    }
1
Rakesh

Рекомендуется использовать событие DataBindingComplete для обновления стиля. Следующий код меняет стиль ячейки:

    private void Grid_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
    {
        this.Grid.Rows[2].Cells[1].Style.BackColor = Color.Green;
    }
0
Ángel Ibáñez