在运行时更改datagridview行颜色

时间:2012-06-15 14:55:09

标签: c# .net-3.5 datagridview datagridviewrow

我正在为我正在开发的控件继承DataGridView控件。 我的目标是使每一行颜色代表一个可以在运行时更改的对象状态。 我的对象实现了Observable设计模式。 所以我决定开发自己的DataGridViewRow类,实现Observer模式并让我的行观察对象。 在这堂课中,我有这个方法:

public void UpdateColors(int state)
{
    DefaultCellStyle.BackColor = m_ETBackColors[state];
    DefaultCellStyle.ForeColor = m_ETForeColors[state];
}

我暂时无法观察我的对象,因此,为了测试颜色变化,我在SelectionChanged事件的选定行上调用了UpdateColors方法。

现在是它不起作用的那一刻! 我之前选择的行保持蓝色(就像它们被选中时一样),滚动时单元格文本是分层的。 我尝试调用DataGridView.Refresh(),但这也不起作用。

我必须添加我的datagridview没有绑定到数据源:我不知道在运行之前我有多少列,所以我手工提供它。

有谁能说我做错了什么?

==========更新==========

这有效:

public void UpdateColors(int state)
{
    DefaultCellStyle.BackColor = System.Drawing.Color.Yellow;
    DefaultCellStyle.ForeColor = System.Drawing.Color.Black;
}

但这不起作用:

public void UpdateColors(int state)
{
    DefaultCellStyle.BackColor = m_ETBackColors[nEtattech];
    DefaultCellStyle.ForeColor = m_ETForeColors[nEtattech];
}

with:

    System.Drawing.Color[] m_ETBackColors = new System.Drawing.Color[] { };
    System.Drawing.Color[] m_ETForeColors = new System.Drawing.Color[] { };

没有数组溢出:它们是构造函数参数。

2 个答案:

答案 0 :(得分:1)

好的,发现了错误。 我使用的颜色是这样创建的:

System.Drawing.Color.FromArgb(value)

不好的是,value是一个整数,表示alpha设置为0的颜色 感谢这篇文章:MSDN social post,我了解到单元格样式不支持ARGB颜色,除非alpha设置为255(它们只支持RGB颜色)。

所以我结束了使用它,这是有效的,但肯定有一个更优雅的方式:

System.Drawing.Color.FromArgb(255, System.Drawing.Color.FromArgb(value));

答案 1 :(得分:0)

使用CellFormatting事件来执行此操作:

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
  if (this.dataGridView1.Rows[e.RowIndex].Cells["SomeStuff"].Value.ToString()=="YourCondition")
    this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Red;
  else
    this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.White;
}