У меня есть DataGridView, который окрашивает свои строки, когда установлено его свойство States.
States — это строка, представляющая список чисел, разделенных точкой с запятой.
Если я получу "0;1;2"
три первых строки будут окрашены в пурпурный, зеленый и красный цвета соответственно.
Проблема возникает, когда я сортирую сетку данных, щелкнув заголовок столбца: цвета применяются одинаково.
Например:
Names|Labels
Name1|Label1
Name2|Label2
Name3|Label3
Я получаю "0;1;2"
, что означает "Фиолетовый;Зеленый;Красный"
:
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"
что означает "Желтый;Оранжевый;Розовый"
:
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;
}
}
}
}