c#如果行不为空,则更改颜色

时间:2012-09-27 12:10:21

标签: c# datagridview colors datagridviewcolumn

我有一张桌子上有一些值。如果行单元格“名称”不为空,则将背景颜色更改为紫色。

Name    ID    Customers

Niky    1     yes       // here change background to violet
        2     no
Donna   3     yes       // here change background to violet
Baka    4     no        // here change background to violet
        5     yes
        6     no

我尝试过这段代码,但我不工作,不知道为什么:

 foreach (DataGridViewRow row1 in dataGridView1.Rows)
        {
            if (row1.Cells[0].Value != null)
            {
                row1.DefaultCellStyle.BackColor = Color.Violet;
            }
        }

4 个答案:

答案 0 :(得分:1)

如果代码位于DataBindingComplete事件处理程序中,通常会将此类事件置于下面,或者使用设计器附加事件:

dataGridView1.DataBindingComplete += new DataGridViewBindingCompleteEventHandler(dataGridView1_DataBindingComplete);

然后在处理程序中你有这样的东西:

void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    foreach (DataGridViewRow row1 in dataGridView1.Rows)
    {
        if (row1.Cells.Cast<DataGridViewCell>().Any(c => c.Value == null || string.IsNullOrWhiteSpace(c.Value.ToString())))
        {
            row1.DefaultCellStyle.BackColor = Color.Violet;
        }
        else
        {
            row1.DefaultCellStyle.BackColor = Color.White;
        }
    }
}

在上面的代码中,我已将原始代码更改为现在查看所有单元格,而不仅仅是第一个单元格。


您也可以将代码放在CellFormatting事件中。

答案 1 :(得分:0)

我不知道你在哪里放置颜色代码,但我总是在绘图部分完成它

Heres oen我在哪里根据状态对线条进行着色,除了依赖于黄色或蓝色的第一列 - 这是进行中的工作代码并且应该整理

  private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
    {
        if (e.RowIndex >= 0 && e.ColumnIndex > 0)
        {
            if (dataGridView1.Rows[e.RowIndex].Cells[].Value.ToString() == "good")
            {
                e.CellStyle.BackColor = Color.PaleGreen;
                    e.CellStyle.SelectionForeColor = Color.Black;
                    e.CellStyle.SelectionBackColor = Color.Wheat;

            }
            if (dataGridView1.Rows[e.RowIndex].Cells[3].Value.ToString() == "warning")
            {
                e.CellStyle.BackColor = Color.LightGoldenrodYellow;
                e.CellStyle.SelectionForeColor = Color.Black;
                e.CellStyle.SelectionBackColor = Color.Wheat;
            }
            if (dataGridView1.Rows[e.RowIndex].Cells[3].Value.ToString() == "error")
            {
                e.CellStyle.BackColor = Color.Salmon;
                e.CellStyle.SelectionForeColor = Color.Black;
                e.CellStyle.SelectionBackColor = Color.Wheat;
            }

                if (e.Value.ToString() == "Yellow")
                {
                    e.CellStyle.BackColor = Color.Yellow;
                }
                else
                    if (e.Value.ToString() == "Blue")
                    {
                        e.CellStyle.BackColor = Color.LightBlue;
                    }


        }
    }

或者你可以这样做:

foreach(DataGridViewRow r in dataGridView1.Rows) 
{ 
      if(!String.IsNullOrEmpty(r.Cells[0].Value.ToString()))
      { 
           r.DefaultCellStyle.BackColor = Color.Violet; 
      } 
} 

所以,如果一行的第一个单元格不为空,则将行着色为紫色。

答案 2 :(得分:0)

您可以在gridview

的rowdatabound事件上执行此操作

你也可以使用这个用途可以通过它:

foreach(DataGridViewRow r in dataGridView1.Rows)
{
      if(r.Cells.Cast<DataGridViewCell>().Any(c => c.Value.ToString() == string.Empty)) 
      {
           r.DefaultCellStyle.BackColor = Color.Violet;
      }
}

答案 3 :(得分:0)

实现这一目标的良好(但不是高效)方式是datagridview的事件cell-formatting。您可以在MSDN中阅读整个文档。重要的是,您订阅了格式化事件,在此您可以进行格式化问题。

通过这种方式,无论用户是在调整大小,滚动任何内容,都可以确保颜色等都很好。

顺便说一句:我不会在绘图事件中这样做,因为我了解到通常会破坏自动绘图逻辑;)

有关详细信息,请参阅MSDN中有关细胞样式的文章,在这种情况下会出现过度杀伤。但你永远不会知道:)