DataGridView行背景颜色没有变化

时间:2012-03-02 04:25:58

标签: c# .net winforms datagridview

即使在Windows窗体中,我也希望根据加载时的特定条件更改DGV行的背景颜色。但我看不到任何DGV行的颜色变化。谁能告诉我怎样才能解决这个问题呢?

private void frmSecondaryPumps_Load(object sender, EventArgs e)
{
            try
            {
                DataTable dt = DeviceData.BindData("SECONDARY_PUMPS".ToUpper());
                dataGridView1.DataSource = dt;

                foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    foreach (DataGridViewColumn column in dataGridView1.Columns)
                    {
                        if (row.Cells[column.Name] != null)
                        {
                            if (row.Cells[column.Name].Value.ToString() == "ON")
                                row.DefaultCellStyle.BackColor = System.Drawing.Color.Green;

                            if (row.Cells[column.Name].Value.ToString() == "OFF")
                                row.DefaultCellStyle.BackColor = System.Drawing.Color.Red;
                        }
                    }
                }

                dataGridView1.Refresh();
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message);
            }
        }

7 个答案:

答案 0 :(得分:12)

我认为最好的方法是在CellFormatting的{​​{1}}事件中设置BackColor,这些就是这些。

DataGridView

答案 1 :(得分:12)

使用cellformattingdatabindingcomplete或甚至paint事件的一个问题是它们被多次触发。根据我收集的内容,datagridview控件存在一个问题,即在显示表单之前,您无法更改任何单元格的颜色。因此,在Shown()被调用之前运行的方法或事件将不会改变颜色。作为问题解决方案的事件通常有效,但由于它们被多次调用,可能不是最有效的答案。

问题的最简单的解决方案可能就是使用代码在表单的Shown()方法而不是构造函数中填充/着色网格。以下是msdn论坛中一篇帖子的链接,该帖子向我提供了解决方案,它被标记为关于页面下方3/4的答案。

MSDN forums post with the Solution

答案 2 :(得分:3)

King_Rob是正确的。我遇到了同样的问题所以我将发布我的实现,因为这里的其他建议远非最佳。

添加事件处理程序(在设计器或构造函数中):

this.Load += UserControl_Load; // or form or any control that is parent of the datagridview
dataGridView1.VisibleChanged += DataGridView1_VisibleChanged;

在load event hander方法中添加一个标志

private bool _firstLoaded;
private void UserControl_Load(object sender, EventArgs e)
{
    _firstLoaded = true;
}

最后在可见事件处理程序方法中:

private void DataGridView1_VisibleChanged(object sender, EventArgs e)
{
    if (_firstLoaded && dataGridView1.Visible)
    {
        _firstLoaded = false;
        // your code
    }
}

答案 3 :(得分:1)

很抱歉迟到的答案,但我现在只是面对完全相同的问题。

对于在构造函数中无法正常工作的内容,我有一些通用的解决方案 - 使用计时器

将其设置为短时间,如100毫秒。然后在构造函数中你将有

timer1.Enabled=true

并在timer_Tick事件中:

timer1.Enabled=false

and all the code that doesn't work in constructor goes here...

每次都对我有用。

答案 4 :(得分:0)

主要问题是在运行此代码时。您使用触发器_Load运行它,这就是为什么它没有着色的原因,当您在表单上使用触发器_Shown运行相同的代码时,着色将起作用。加载表单时会触发加载,因此在代码之后仍会运行一些幕后代码。所显示的触发器在完成所有操作并完全加载表单后运行。

答案 5 :(得分:-1)

此代码快速,简单且不占用内存!

例如,在CellEndEdit事件

中使用此代码
 `try{
 //your code
 }
 catch(Exception){
 //your exception
 }
finally{
yourDataGridView.Visible = false;
 yourDataGridView.Visible = true;
}

`

答案 6 :(得分:-1)

使用以下代码更改Datagrid项目的颜色

Datagrid1.SelectedIndex = e.Item.ItemIndex;
Datagrid1.Items[e.Item.ItemIndex].Cells[0].BackColor = System.Drawing.Color.Green;