Benutzer mit den meisten Antworten
DataGridView Zeilenfarbe einstellen

Frage
-
Hallo,
kann mir jemand sagen, warum folgender Code nicht die gewünschte wirkung hat, nämlich Gruppen alternierend grau/weiß zu färben?
Ich lade Daten, geordnet nach GruppenSpalte, aus einer Datenbank in ein DataSet, lade die Daten in ein DataGridView und möchte dann über dieses DataGridView iterieren und pro Gruppe die Farbe alternieren.
dataGrid.DataSource = ds.Tables["DataGridResultset"]; //color groups bool isGrey = false; string previousGroupStr = null, currentGroupStr = null, groupBy1Col = cmbGroupBy1.SelectedItem.ToString(); foreach (DataGridViewRow dgr in dataGrid.Rows) { if (dgr.DataBoundItem == null) continue; //omit empty rows currentGroupStr = dgr.Cells[groupBy1Col].Value.ToString(); if (previousGroupStr == null) //first group previousGroupStr = currentGroupStr; else if (currentGroupStr == previousGroupStr) //same group ; //do nothing else if (currentGroupStr != previousGroupStr) //new group { previousGroupStr = currentGroupStr; isGrey = !isGrey; //toggle isGrey } if (isGrey) { foreach (DataGridViewCell cell in dgr.Cells) { cell.Style.BackColor = Color.LightGray; //hat keine Wirkung ?? } } }
PS: Ich verzichte bewusst auf das Cell_Formatting-Event, mir reicht eine anfängliche Färbung, die bei erneutem Rendern überschrieben wird.
- Bearbeitet Flux1989 Mittwoch, 29. August 2012 13:18
Antworten
-
Hab mir jetzt einfach eine Checkbox: "Show Groups" in den Tab eingefügt, beim klick event wird das skript ausgeführt und gut is...
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 26. September 2012 16:53
Alle Antworten
-
Hallo,
wenn Du keinen expliziten Zellstil festlegst, so verwendet jede Zelle den DefaultCellStyle.
Aus den Performance-Gründen sollte man soweit wie möglich gemeinsame Zellstile verwenden,
hier z. B. zwei für weiß und einen für hellgrau. Mehr siehe:
Gewusst wie: Festlegen von Schriftart- und Farbstilen im DataGridView-Steuerelement in Windows Forms
und Empfohlene Vorgehensweisen für das Skalieren des DataGridView-Steuerelements in Windows Forms
Gruß Elmar
-
Hallo Elmar Darling,
danke für deine Antwort.
Jede Zelle in dem Steuerelement erbt die durch [die DefaultCellStyle-Eigenschaft] festgelegten Stile, sofern sie nicht auf Spalten-, Zeilen- oder Zellenebene überschrieben werden.
In den verlinkten Artikeln wird um Grunde nur gesagt, dass man die Eigenschaften des DataGridView beliebig überschreiben kann, z.B.
this.dataGridView1.DefaultCellStyle.BackColor = Color.Beige;
Effizienz hin oder her.. aber genau das funktioniert bei mir nicht, warum auch immer..
-
Hallo,
danke für deine Antwort. Das dachte ich zeitweise auch, bins aber im Einzelschrittmodus durchgegangen, daran liegts nicht.
DAS KOMISCHE IST: Ab dem zweiten Durchlauf klappt es !? (der Code im ersten Beitrag befindet sich in einem button-click-eventhandler)
Das verstehe ich nicht. Ihr vielleicht?
Anscheinend macht mir das cellformatting event die grau-färbung kaputt?- Bearbeitet Flux1989 Freitag, 31. August 2012 10:28
-
Also, ausgiebiges Testen ergab:
folgendes geht:
dg.Columns.Add("bla", "blub"); dg.Rows.Add(1);
dg.Rows[0].Cells[0].Style.BackColor = Color.Green;
sobald ich aber ein DataTable an dg.DataSource zuweise klappts nicht mehr:
DataTable dt = new DataTable("bla"); dt.Columns.Add("blub"); dt.Rows.Add(1); dg.DataSource = dt; //Was passiert hier mit CellStyle? dg.Rows[0].Cells[0].Style.BackColor = Color.Green;
Blickt da jemand durch?- Bearbeitet Flux1989 Freitag, 31. August 2012 12:07
-
Bin wieder einen Schritt weiter:
mein DataGridView befindet sich in einem Tab. Wenn ich den Tab auswaehle werden pro zeile das dg.RowsAdded und RowsRemoved Event aufgerufen, was mir die Formattierung überschreibt.
Kann man das abstellen?
- Bearbeitet Flux1989 Freitag, 31. August 2012 12:44
-
Hallo,
abstellen kann man das auf einfachste Weise:
Zeichne dann wenn es das DataGridView erwartet.
Deine "Optimierungsversuche" gehen letztendlich am Konzept des Zeichnens unter Windows vorbei. Und das führt zu unbefriedigenden Ergebnissen, nicht nur beim DataGridView.Wenn Du den Aufwand für die Gruppierung minimieren willst,
so füge eine (verdeckte) Spalte zur Datenquelle hinzu,
die Du für die Auswahl des CellStyles verwendest.Gruß Elmar
-
Hallo,
dieses Konzept hatt ich vorher verfolgt:
in einem Dictionary für jede gruppe eine isGrey-Spalte mit false true zugeordnet und dann im cellformatting-event diese spalte geprüft, um zu färben.
Problem: direkt nach der ersten Auswahl des Tabs werden die dg.RowsRemoved und Added Events aufgerufen. Wähle ich den Tab ein weiteres Mal aus, dann funktionierts.
Also suche ich gerade ein geeignetes Event, in der die Färbung geschieht. Es muss nach RowsAdded und RowsRemoved aufgerufen werden.
-
Hab mir jetzt einfach eine Checkbox: "Show Groups" in den Tab eingefügt, beim klick event wird das skript ausgeführt und gut is...
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 26. September 2012 16:53