it-roy-ru.com

DataGridView изменение цвета фона ячейки

У меня есть следующий код:

private void dgvStatus_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    foreach (DataGridViewRow row in dgvStatus.Rows)
    {
        row.Cells[color.Index].Style.BackColor = Color.FromArgb(((GesTest.dsEssais.FMstatusAnomalieRow)row.DataBoundItem).iColor);
    }
}

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

Я искал вокруг, но не нашел ничего полезного

14
Rémi

Мне наконец удалось заставить это работать. Вот код:

private void dgvStatus_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (e.ColumnIndex != color.Index)
        return;

    e.CellStyle.BackColor = Color.FromArgb(int.Parse(((DataRowView)dgvStatus.Rows[e.RowIndex].DataBoundItem).Row[4].ToString()));
}

если кто-нибудь знает, как лучше это сделать, пожалуйста, не стесняйтесь размещать его Я открыт для предложений

15
Rémi

Просто создайте новый DataGridViewCellStyle объект, установите его задний цвет и затем назначьте ему стиль ячейки:

    DataGridViewCellStyle style = new DataGridViewCellStyle();
    style.BackColor = Color.FromArgb(((GesTest.dsEssais.FMstatusAnomalieRow)row.DataBoundItem).iColor);
    style.ForeColor = Color.Black;
    row.Cells[color.Index].Style = style;
27
Jeb

Если вас все еще интересует почему сначала это не сработало для вас:

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

Изменение стилей ячеек в событиях, предложенных здесь, будет работать, но они вызываются несколько раз, в результате чего изменения стиля происходят чаще, чем вы хотите, и поэтому не очень эффективны.

Чтобы решить эту проблему, измените стиль после точки в вашем коде, в которой отображается форма, или подпишитесь на событие Shown и поместите туда свои изменения (это событие вызывается значительно меньше, чем другие предложенные события).

9
Ysch
dataGridView1.Rows[i].Cells[7].Style.BackColor = Color.LightGreen;
4
Serkan Acuner
int rowscount = dataGridView1.Rows.Count;         

for (int i = 0; i < rowscount; i++)
{            
    if (!(dataGridView1.Rows[i].Cells[8].Value == null))
    {
        dataGridView1.Rows[i].Cells[8].Style.BackColor = Color.LightGoldenrodYellow;
    }
}
2
Serkan Acuner
protected void grdDataListeDetay_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        if (e.Row.Cells[3].Text != "0")
        {
            for (int i = 0; i <= e.Row.Cells.Count - 1; i++)
            {
                e.Row.Cells[i].BackColor = System.Drawing.Color.Beige;
            }
        }
    }
}
0
ertugrulakdag

попробуйте следующее (в методе RowDataBound GridView): 

protected void GridViewUsers_RowDataBound(object sender, GridViewRowEventArgs e)
{
    // this will only change the rows backgound not the column header 

    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        e.Row.Cells[0].BackColor = System.Drawing.Color.LightCyan; //first col
        e.Row.Cells[1].BackColor = System.Drawing.Color.Black; // second col
    }
}
0
Awaidus
dataGridView1[row, col].Style.BackColor = System.Drawing.Color.Red;
0
sailfish009