Ich habe ein DataGridView, das seine Zeilen färbt, wenn die States-Eigenschaft festgelegt ist.
States ist ein String, der eine durch Strichpunkte getrennte Nummernliste darstellt.Zugriff auf DataGridView-Zeilen in der Reihenfolge, in der sie hinzugefügt wurden
Wenn ich "0;1;2"
erhalte, sind die drei ersten Zeilen in grün, rot und rot gefärbt.
Das Problem kommt, wenn ich das Datagrid auf eine Spaltenüberschrift sortieren: Farben werden auf die gleiche Weise angewendet.
Zum Beispiel:
Names|Labels
Name1|Label1
Name2|Label2
Name3|Label3
I erhalten "0;1;2"
was bedeutet "Purple;Green;Red"
:
Names|Labels
Name1|Label1 => Purple
Name2|Label2 => Green
Name3|Label3 => Red
I sort (absteigend):
Names|Labels
Name3|Label3 => Red
Name2|Label2 => Green
Name1|Label1 => Purple
I "3;4;5"
erhalten, die "Yellow;Orange;Pink"
bedeutet:
Names|Labels
Name3|Label3 => Yellow
Name2|Label2 => Orange
Name1|Label1 => Pink
Aber das ist nicht das, was ich erwartete, wollte ich, dass:
Names|Labels
Name3|Label3 => Pink
Name2|Label2 => Orange
Name1|Label1 => Yellow
Hier ist mein Code:
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;
}
}
}
Gibt es nicht eine Möglichkeit, den Zugang zu haben um die Reihenfolge zu sortieren, in der sie in der DataGridView hinzugefügt wurden?
PS: Ich habe zuerst row.Index anstelle von nRowNumber verwendet, also glaubte ich, dass das Problem daraus kam, aber anscheinend wird die Rows-Sammlung reorganisiert oder die foreach analysiert sie nach den rowIndexes.
===== Hier ist die Lösung, die ich dank LarsTech's answer ===== verwendet
Nach meiner Zeilen hinzufügen, ich sie auf diese Weise dem Stichwort:
foreach(System.Windows.Forms.DataGridViewRow row in Rows)
{
row.Tag = row.Index;
}
Dann könnte ich diese verwenden Tag als Zeilennummer:
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;
}
}
}
}
Vielen Dank, das funktioniert. Ich werde mich beim nächsten Mal an den Tag-Trick erinnern! ^^ – Rifu
Da die Tag-Eigenschaft ein Objekt ist, glaube ich nicht, dass es einen Grund gibt, das Tag als String zu speichern. Sie können versuchen, "dataGridView1.Rows [i] .Tag = i" und dann "int rowIndex = i" anstelle der Tostring() - und Convert.ToInt-Versionen zu verwenden. –
@BPete Wahr. Aktualisiert. – LarsTech