我有一个 DataGridView,它在设置 States 属性时为其行着色。
States 是一个字符串,它表示一个以分号分隔的数字列表。
如果我收到"0;1;2"
前三行将分别用紫色、绿色和红色着色。
当我点击列标题对数据网格进行排序时,问题就来了:颜色的应用方式相同。
例如 :
Names|Labels
Name1|Label1
Name2|Label2
Name3|Label3
我收到"0;1;2"
这意味着"Purple;Green;Red"
:
Names|Labels
Name1|Label1 => Purple
Name2|Label2 => Green
Name3|Label3 => Red
我排序(降序):
Names|Labels
Name3|Label3 => Red
Name2|Label2 => Green
Name1|Label1 => Purple
我收到"3;4;5"
这意味着"Yellow;Orange;Pink"
:
Names|Labels
Name3|Label3 => Yellow
Name2|Label2 => Orange
Name1|Label1 => Pink
但这不是我在等待的,我想要的是:
Names|Labels
Name3|Label3 => Pink
Name2|Label2 => Orange
Name1|Label1 => Yellow
这是我的代码:
protected String m_States;
public virtual String States
{
get { return m_States; }
set {
m_States = value;
if (m_bRunning)
{
UpdateColors();
}
}
}
private void UpdateColors()
{
String[] sStates = new String[] { };
if (m_States != null)
{
sStates = m_States.Split(m_sSeparators);
int nState = 0;
int nRowNumber = 0;
foreach (System.Windows.Forms.DataGridViewRow row in Rows)
{
nState = int.Parse(sStates[nRowNumber]);
if (nState < 0 || nState > m_Couleurs_Fond_Etats.Length)
{
nState = m_Couleurs_Fond_Etats.Length - 1;
}
row.DefaultCellStyle.BackColor = m_Couleurs_Fond_Etats[nState];
row.DefaultCellStyle.ForeColor = m_Couleurs_Texte_Etats[nState];
row.DefaultCellStyle.SelectionBackColor = m_Couleurs_Sel_Fond_Etats[nState];
row.DefaultCellStyle.SelectionForeColor = m_Couleurs_Sel_Texte_Etats[nState];
nState = 0;
++nRowNumber;
}
}
}
没有办法按照在 DataGridView 中添加的顺序访问行吗?
PS:我第一次使用row.Index而不是nRowNumber,所以我认为问题来自于此,但显然,Rows集合被重新组织或者foreach根据rowIndexes解析它。
=====感谢LarsTech的回答,这是我使用的解决方案=====
添加行后,我以这种方式标记它们:
foreach(System.Windows.Forms.DataGridViewRow row in Rows)
{
row.Tag = row.Index;
}
然后我可以使用这个标签作为行号:
private void UpdateColors()
{
String[] sStates = new String[] { };
if (m_States != null)
{
sStates = m_States.Split(m_sSeparators);
int nState = 0;
int nRowNumber = 0;
foreach (System.Windows.Forms.DataGridViewRow row in Rows)
{
nRowNumber = Convert.ToInt32(row.Tag);
if (nRowNumber >= 0 && nRowNumber < sEtats.Length)
{
nState = int.Parse(sStates[nRowNumber]);
if (nState < 0 || nState > m_Couleurs_Fond_Etats.Length)
{
nState = m_Couleurs_Fond_Etats.Length - 1;
}
row.DefaultCellStyle.BackColor = m_Couleurs_Fond_Etats[nState];
row.DefaultCellStyle.ForeColor = m_Couleurs_Texte_Etats[nState];
row.DefaultCellStyle.SelectionBackColor = m_Couleurs_Sel_Fond_Etats[nState];
row.DefaultCellStyle.SelectionForeColor = m_Couleurs_Sel_Texte_Etats[nState];
nState = 0;
}
}
}
}