C#DataGridView BackColor未被覆盖

时间:2017-09-21 14:36:24

标签: c# datagridview backcolor

我的表单应用程序上有DataGridView。从数据库中的表中检索数据并在DataGridView中显示数据后,我将绿色颜色应用于行的某些单元格的 BackColor 满足一定条件。 在这些单元格被绿色着色之后,程序会让它们经历另一个条件,如果它们将整行 BackColor 红色着色不满足条件。

然而,似乎预先着色的细胞不能用新颜色覆盖。 即使我应用以下代码为整行红色着色,它也仅适用于尚未预先着色的单元格。

for(int i=0; i<myDataGridview.Rows.Count; i++){  
    if(/*a certain condition FAILS*/){
        myDataGridView.Rows[i].DefaultCellStyle.BackColor = Color.Red;
    }
}

现在,我正逐一着色那些预先着色的细胞红色,但这需要花费大量时间和代码,如:

for(int i=0; i<myDataGridview.Rows.Count; i++){  
    if(/*a certain condition FAILS*/){
        //Trying to color the whole row RED, but not working
        myDataGridView.Rows[i].DefaultCellStyle.BackColor = Color.Red;
        //Manually color the cells, which are pre-colored to green, RED
        myDataGridView.Rows[i].Cells[6].Style.BackColor = Color.Red;
        myDataGridView.Rows[i].Cells[7].Style.BackColor = Color.Red;
        ....
        myDataGridView.Rows[i].Cells[13].Style.BackColor = Color.Red;
        myDataGridView.Rows[i].Cells[16].Style.BackColor = Color.Red;
    }
}

我想知道是否有更好的方法来覆盖backColor。有人可以帮忙吗?

这是一个示例(模仿)DataGridView。

Green Cells not overridden by Red Row

那些第一个条件失败的人会自动将整行排成红色,这样可行。但是,如果他们通过第一个条件并获得他们的&#34; Passed1&#34;细胞绿色,然后失败第二个条件,如你所见,这些细胞保持绿色。我想将整行红色,甚至将预先着色到绿色的单元格覆盖为红色。

2 个答案:

答案 0 :(得分:0)

datagridview控件存在一个问题,即在使用DefaultCellStyle属性显示表单之后,您无法更改任何单元格的颜色。因此,在调用Shown()之前运行的方法或触发的事件不会改变颜色。这可能是问题。可能你必须创建一个绘画方法并在Shown()之前调用它。

答案 1 :(得分:0)

绘制单元格时,单元格背景颜色具有优先顺序。从顶部开始,它将在列表中向下级联,直到颜色设置为*:

  1. Cell.Style.BackColor
  2. Row.DefaultCellStyle.BackColor
  3. DataGridView.AlternatingRowsDefaultCellStyle.BackColor
  4. DataGridView.RowsDefaultCellStyle.BackColor
  5. Column.DefaultCellStyle.BackColor
  6. DataGridView.DefaultCellStyle.BackColor
  7. *此列表并不广泛,可能不包含所有可能的BackColor可访问属性。

    您可能正在做的事情类似于为Cell.Style.BackColor列中的单元格设置Passed1,然后是您发布的代码逻辑。由于Green的优先级高于设置的Red,因此会产生类似于您的结果:

    Green Cells not overridden by Red Row

    假设您的两个Passed列的条件是二进制(YesNo),您可以通过&#34;降低&#34;来解决这个问题。通过设置Green

    Column.DefaultCellStyle.BackColor背景的优先级
    private void DataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
    {
        this.dataGridView1.Columns["Passed1"].DefaultCellStyle.BackColor = Color.Green;
        this.dataGridView1.Columns["Passed2"].DefaultCellStyle.BackColor = Color.Green;
    
        foreach (DataGridViewRow row in this.dataGridView1.Rows)
        {
            if (row.Cells["Passed1"].Value.ToString() == "No" || row.Cells["Passed2"].Value.ToString() == "No")
            {
                row.DefaultCellStyle.BackColor = Color.Red;
            }
        }
    }
    

    结果是:

    Green Cells overridden by Red Rows