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;
}
}
}
}
Muchas gracias, eso funciona. ¡Recordaré el truco de la etiqueta la próxima vez! ^^ – Rifu
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. –
@BPete True. Actualizado. – LarsTech