Jochen_Schneider
Mitglied
Hallo,
ich habe ein DataGridView zur Anzeige von Datensätzen. Dies funktioniert mittlerweile prima. Nun ist es so, dass ich die angezeigten Daten überprüfen möchte und, falls etwas nicht stimmt, eine Zelle rot einfärben will.
Um genau zu sein: Es soll überprüft werden, ob die vom Benutzer angegebene Startklasse (Spalte "Kategorie") vereinbar mit seinem Alter ist. Gelöst habe ich es folgendermaßen:
Die Variable "bKategorieFalsch" wird in der Routine gesetzt, die für das Befüllen des DataTable zuständig ist (siehe folgenden Ausschnitt):
Wenn ich nur einen Datensatz habe, funktioniert alles prima. Sobald aber mehrere vorhanden sind, wird keine Zelle mehr rot eingefärbt. Beim Schrittweisen durchgehen mit dem Debugger habe ich folgende Reihenfolge der Abarbeitung festgestellt:
1. Zeile hinzufügen
2. CellFormatting-Event abarbeiten (direkt nach Rows.Add(row))
3. Zurück zu 1
Demnach müsste es ja eigentlich funktionieren. Tut es aber nicht
Hat jemand eine Idee? Fehlt im Ereignis-Handler vielleicht noch eine entscheidende Zeile?
ich habe ein DataGridView zur Anzeige von Datensätzen. Dies funktioniert mittlerweile prima. Nun ist es so, dass ich die angezeigten Daten überprüfen möchte und, falls etwas nicht stimmt, eine Zelle rot einfärben will.
Um genau zu sein: Es soll überprüft werden, ob die vom Benutzer angegebene Startklasse (Spalte "Kategorie") vereinbar mit seinem Alter ist. Gelöst habe ich es folgendermaßen:
C#:
private void dataGrid_Registrierungen_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
//Falls Alter und Kategorie nicht zusammenpassen, den Hintergrund der Zelle rot einfärben
if (dataGrid_Registrierungen.Columns[e.ColumnIndex].Name == "Kategorie")
{
if (bKategorieFalsch)
{
e.CellStyle.BackColor = Color.Red;
bKategorieFalsch = false;
e.FormattingApplied = true;
}
}
}
Die Variable "bKategorieFalsch" wird in der Routine gesetzt, die für das Befüllen des DataTable zuständig ist (siehe folgenden Ausschnitt):
C#:
//Daten im Grid anzeigen
for (int i = 0; i < tableRegData.Rows.Count; i++)
{
DataRow tempRow = tableRegData.Rows[i];
DataRow row = dsDaten.Tables["Table_Registrierungen"].NewRow();
row["Name"] = tempRow["name"];
row["Vorname"] = tempRow["vorname"];
row["Startnummer"] = tempRow["startnummer"];
row["Geburtsdatum"] = tempRow["geburtstag"]; //Format im Table festgelegt
row["Geschlecht"] = tempRow["geschlecht"];
row["Anmeldungsdatum"] = tempRow["anm_datum"]; //Format im Table festgelegt
//Kategorie anzeigen
strSQL = "SELECT * FROM kategorien ";
strSQL += "WHERE kategorie_id = " + tempRow["kategorie_id"];
tableKategorie = GetDataTable(strSQL);
DataRow kategorieRow = tableKategorie.Rows[0]; //Nur 1 Ergebnis
row["Kategorie"] = kategorieRow["bezeichnung"];
//Kategorie richtig?
int nCurYear = DateTime.Today.Year;
int nGebYear = Convert.ToDateTime(tempRow["geburtstag"]).Year;
int nKategorieAlterVon = Convert.ToInt32(kategorieRow["alter_von"]);
int nKategorieAlterBis = Convert.ToInt32(kategorieRow["alter_bis"]);
int nAlter = nCurYear - nGebYear;
if (!((nAlter >= nKategorieAlterVon) && (nAlter <= nKategorieAlterBis)))
bKategorieFalsch = true;
dsDaten.Tables["Table_Registrierungen"].Rows.Add(row);
}
Wenn ich nur einen Datensatz habe, funktioniert alles prima. Sobald aber mehrere vorhanden sind, wird keine Zelle mehr rot eingefärbt. Beim Schrittweisen durchgehen mit dem Debugger habe ich folgende Reihenfolge der Abarbeitung festgestellt:
1. Zeile hinzufügen
2. CellFormatting-Event abarbeiten (direkt nach Rows.Add(row))
3. Zurück zu 1
Demnach müsste es ja eigentlich funktionieren. Tut es aber nicht

Hat jemand eine Idee? Fehlt im Ereignis-Handler vielleicht noch eine entscheidende Zeile?
Zuletzt bearbeitet: