2012-06-22 20 views
6

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

Antwort

4

Sie können versuchen, die Tag Eigenschaft der Zeile mit Ihrer Zeilenindexnummer zu platzieren. Dies ist, wie ich hatte meine Datagridview initialisiert:

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

Hier ist meine Version Ihrer UpdateColors Routine:

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

ich zum ersten Mal durch Ihren gespaltet Zustand Zeichenfolge am Looping den Zeilenindex zu erhalten und die konvertieren Istwert zum Farbindex. Dann durchlaufe ich die Zeilen, um die passende Indexeigenschaft zu finden, die ich in die Eigenschaft Tag platziert habe.

ist hier ein aufgeräumt Version nur die eine Schleife:

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

Fehler offensichtlich überprüft werden muss.

+0

Vielen Dank, das funktioniert. Ich werde mich beim nächsten Mal an den Tag-Trick erinnern! ^^ – Rifu

+2

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. –

+0

@BPete Wahr. Aktualisiert. – LarsTech

Verwandte Themen