RowsAdded事件在更改DataGridView中的行的颜色时发生了奇怪的行为

时间:2012-11-23 13:47:02

标签: c# .net datagridview

我将DataGridView绑定到(付款'对象列表)集合,我正在使用RowsAdded事件根据付款状态更改行的背景颜色。 我正在使用(row.DefaultCellStyle.BackColor)来改变背面颜色,但是如果我改变了第一行的颜色,那么第二行的颜色也会改变,即使我没有改变它的背面颜色。 并且我不想将其背面颜色更改为(白色),因为有些列具有自己的颜色。

private void dgvPayment_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {

            DataGridViewRow row = dgvPayment.Rows[e.RowIndex];
            Payment  lPayment = row.DataBoundItem as Payment;
            if (lPayment != null)
                if (lPayment.IsLocked)
                {
                    row.DefaultCellStyle.BackColor = Color.LightPink;
                    row.ReadOnly = true;
                }
        }

如何解决这个问题?

您可以下载here的源代码。

2 个答案:

答案 0 :(得分:1)

行添加事件的行为有些不可预测 - 对于这种网格操作,通常最好使用其他事件。

在这种情况下,请使用CellFormatting事件:

void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    DataGridViewRow row = dgvPayment.Rows[e.RowIndex];
    Payment  lPayment = row.DataBoundItem as Payment;
    if (lPayment != null && lPayment.IsLocked)
    {                
        row.DefaultCellStyle.BackColor = Color.LightPink;
    }
    else
    {
        row.DefaultCellStyle.BackColor = Color.White;
    }
}

答案 1 :(得分:1)

问题是当我把backColor变成白色时,整行会变成白色,我不想要这个,因为有一个列有自己的backColor。

如上所述here(datagridview-defaultcellstyle-rows-and-columns-priority):

  

它可能是DataGridViews内部的东西,其中行样式   显式地覆盖列样式或因为行样式   应用于列样式之上。

     

除了为第一行和第一行设置默认样式外   列,尝试直接设置第一个单元格的样式,这将是   覆盖任何默认值,无论是行还是列。

所以我解决了这个问题;

private void dgvPayment_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {
            for (int index = e.RowIndex; index <= e.RowIndex + e.RowCount - 1; index++)
            {
                DataGridViewRow row = dgvPayment.Rows[index];
                Payment lPayment = row.DataBoundItem as Payment;
                if (lPayment != null && lPayment.IsLocked)
                {
                    row.DefaultCellStyle.BackColor = Color.Pink;
                    row.ReadOnly = true;
                }
                else
                {
                    row.DefaultCellStyle = null;
                    row.ReadOnly = false;
                }


            }
        }