我正在为我正在开发的控件继承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[] { };
没有数组溢出:它们是构造函数参数。
答案 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;
}