C# 在DataGridView中更改行的背面颜色时,RowsAdded事件发生了奇怪的行为

C# 在DataGridView中更改行的背面颜色时,RowsAdded事件发生了奇怪的行为,c#,.net,datagridview,C#,.net,Datagridview,我将一个DataGridView绑定到一个(付款对象列表)集合,我使用RowsAdded事件根据付款状态更改行的背景色。 我正在使用(row.DefaultCellStyle.BackColor)更改背景颜色,但如果我更改了第一行的颜色,则第二行的颜色也将更改,即使我没有更改其背景颜色。 我不想把它的背景颜色改成(白色),因为有些列有自己的颜色 private void dgvPayment_RowsAdded(object sender, DataGridViewRowsAddedEventA

我将一个
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;
                }
        }
如何解决这个问题


您可以下载源代码。

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

在这种情况下,请使用
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;
    }
}

问题是,当我将背景颜色设置为白色时,整行将变为白色,我不希望这样,因为有一列有自己的背景颜色

如上所述(datagridview defaultcellstyle行和列优先级):

它可能是DataGridView内部的东西,其中包含行样式 显式替代列样式,或者因为行样式是 应用于列样式的顶部

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

所以我就这样解决了,

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;
                }


            }
        }
private void dgvPayment_RowsAdded(对象发送方,DataGridViewRowsAddedEventArgs e)
{

对于(int index=e.RowIndex;index),他不必改变更新行的方式。只是他的逻辑意味着这对于特定状态来说是个问题(即选择第一行)-不是;每次更新时都需要设置默认单元格样式。@Killercam我尝试了您的解决方案,但在使用RowsUpdated事件时,该解决方案并不总是有效。在某些情况下(可能是在最后一行之后的行已锁定时)这些行的颜色不正确。根据我的测试,它可以正常工作。只要事件被触发,它应该始终正确地更新颜色。公平地测试我的解决方案。祝您一切顺利,周末愉快。:]感谢您的重播。这将使行中所有单元格的颜色都为白色,但某些列应为亮t墨水颜色。我张贴了答案。