2012-06-22 15 views
6

Tengo un DataGridView que colorea sus filas cuando se establece su propiedad States.
Estados es una cadena que representa una lista de números separados por punto y coma.Acceso a DataGridView filas el orden en que se agregaron

Si recibo "0;1;2", las tres primeras filas aparecerán en color verde, rojo y rojo, respectivamente.
El problema surge cuando ordeno la cuadrícula de datos haciendo clic en el encabezado de una columna: los colores se aplican de la misma manera.

Por ejemplo:

Names|Labels 
Name1|Label1 
Name2|Label2 
Name3|Label3 

recibo "0;1;2" que significa "Purple;Green;Red":

Names|Labels 
Name1|Label1 => Purple 
Name2|Label2 => Green 
Name3|Label3 => Red 

I sort (descendente):

Names|Labels 
Name3|Label3 => Red 
Name2|Label2 => Green 
Name1|Label1 => Purple 

recibo "3;4;5" que significa "Yellow;Orange;Pink":

Names|Labels 
Name3|Label3 => Yellow 
Name2|Label2 => Orange 
Name1|Label1 => Pink 

Pero esto no era lo que estaba esperando a que es, quería que:

Names|Labels 
Name3|Label3 => Pink 
Name2|Label2 => Orange 
Name1|Label1 => Yellow 

Aquí está mi código:

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; 
    } 
    } 
} 

no hay una manera de tener acceso para filas el orden en que se agregaron en el DataGridView?

PD: Primero utilicé row.Index en lugar de nRowNumber, así que creí que el problema provenía de eso, pero aparentemente, la colección de Filas se reorganiza o el foreach la analiza de acuerdo con los rowIndexes.

===== Aquí está la solución Solía ​​gracias a LarsTech's answer =====

Después de añadir mis filas, les tagged esta manera:

foreach(System.Windows.Forms.DataGridViewRow row in Rows) 
{ 
    row.Tag = row.Index; 
} 

Entonces podría utilizar este etiqueta como número de fila:

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; 
     } 
    } 
    } 
} 

Respuesta

4

Usted puede intentar usar la propiedad Tag de la fila para colocar su número de índice de la fila. Así es como yo tenía mi DataGridView inicializado:

dataGridView1.Rows.Add(3); 
for (int i = 0; i < 3; i++) { 
    dataGridView1.Rows[i].Tag = i; 
    dataGridView1.Rows[i].Cells[0].Value = "Name " + i.ToString(); 
    dataGridView1.Rows[i].Cells[1].Value = "Label " + i.ToString(); 
} 

aquí está mi versión de su rutina UpdateColors:

private void UpdateColors() { 
    String[] sStates = new String[] { }; 
    if (m_States != null) { 
    sStates = m_States.Split(';'); 
    for (int i = 0; i < sStates.Length;i++) { 
     int nState = Convert.ToInt32(sStates[i]); 
     foreach (DataGridViewRow row in dataGridView1.Rows) { 
     int rowIndex = Convert.ToInt32(row.Tag); 
     if (rowIndex == i) { 
      row.DefaultCellStyle.BackColor = m_Couleurs_Fond_Etats[nState]; 
     } 
     } 
    } 
    } 
} 

Estoy primer bucle a través de su cadena de estado dividido para obtener el índice de la fila y para convertir el valor real para el índice de color. A continuación, recorro las filas para encontrar la propiedad de índice coincidente que coloqué en la propiedad Tag.

Aquí es una versión limpia usando sólo el bucle: comprobar

private void UpdateColors() { 
    String[] sStates = new String[] { }; 
    if (m_States != null) { 
    sStates = m_States.Split(';'); 
    foreach (DataGridViewRow row in dataGridView1.Rows) { 
     int rowIndex = Convert.ToInt32(row.Tag); 
     int colorIndex = Convert.ToInt32(sStates[rowIndex]); 
     row.DefaultCellStyle.BackColor = m_Couleurs_Fond_Etats[colorIndex]; 
    } 
    } 
} 

error Necesidades obviamente.

+0

Muchas gracias, eso funciona. ¡Recordaré el truco de la etiqueta la próxima vez! ^^ – Rifu

+2

Dado que la propiedad de etiqueta es un objeto, no creo que haya ninguna razón para almacenar la etiqueta como una cadena. Es posible que desee intentar usar "dataGridView1.Rows [i] .Tag = i" y luego "int rowIndex = i" en lugar de las versiones de Tostring() y Convert.ToInt. –

+0

@BPete True. Actualizado. – LarsTech

Cuestiones relacionadas