none
DataGridView Zeilenfarbe einstellen RRS feed

  • 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
    Mittwoch, 29. August 2012 13:16

Antworten

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

    Mittwoch, 29. August 2012 19:02
    Beantworter
  • 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..

    Donnerstag, 30. August 2012 19:24
  • Ich habe einen Vorschlag.

    Versuch

                if (dgr.DataBoundItem == null) continue; //omit empty rows
    

     durch

                if (dgr.Cells[groupBy1Col].Value == null) continue; // omit empty rows.

    ersetzen.

    Freitag, 31. August 2012 04:00
  • 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
    Freitag, 31. August 2012 10:20
  • 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
    Freitag, 31. August 2012 11:59
  • 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
    Freitag, 31. August 2012 12:43
  • 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

    Freitag, 31. August 2012 13:02
    Beantworter
  • 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.

    Freitag, 31. August 2012 13:43
  • Hab mir jetzt einfach eine Checkbox: "Show Groups" in den Tab eingefügt, beim klick event wird das skript ausgeführt und gut is...

    Freitag, 31. August 2012 14:05