Доступ к строкам DataGridView в том порядке, в котором они были добавлены.

У меня есть 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;
      }
    }
  }
}

6
задан Community 23 May 2017 в 10:09
поделиться