1

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

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

4 回答 4

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 事件中。

于 2012-09-27T13:55:08.390 回答
0

我不知道你把颜色代码放在哪里,但我总是在绘图部分做

这是我根据状态为线着色的地方,除了依赖黄色或蓝色的第一列 - 这是正在进行的代码,应该整理一下

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

因此,如果一行的所有第一个单元格都不为空,则将该行着色为紫色。

于 2012-09-27T12:14:14.553 回答
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;
      }
}
于 2012-09-27T12:20:22.710 回答
0

实现这一点的一个好的(但不是高性能的)方法是cell-formattingdatagridview 的事件。您可以阅读MSDN中的整个文档。本质是,您订阅了格式化事件,在此您可以解决格式化问题。

这样,无论用户是否正在调整大小、滚动任何内容,您都可以确保颜色等都很好。

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

有关更多信息, MSDN中有一篇关于 cellstyles 的文章,在这种情况下,这将是矫枉过正。但你永远不会知道足够的:)

于 2012-09-27T12:47:24.987 回答