Announcement

Collapse
No announcement yet.

DataGridView Bedingte Formatierung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DataGridView Bedingte Formatierung

    Hi,

    ich habe ein DGV mit vielen Datensätzen.
    Die Daten kommen per DataSource = gibDatensaetze() (DataTable) an das DGV heran.

    Nun möchte ich das die Zeilen abwechselnd unterschiedliche Farben haben, das ist kein Problem (DefaultCellStyle, AlternatingRowsDefaultCellStyle) und wenn bestimmte Kriterien erfüllt sind sollen sie nochmal andere Farben bekommen.

    Also z.B.:

    Datensatz 1 (Style1)
    Datensatz 2 (Style2)
    Datensatz 3 (Style1)
    Zwischensumme (StyleZs)
    Datensatz 4 (Style1)
    Datensatz 5 (Style2)
    Datensatz 6 (Style1)
    Zwischensumme (StyleZs)
    Endsumme (StyleEs)

    In der ersten Spalte (welche Visible = False ist) steht 0 für Datensatz, 1&2 für ZWischensumme und 3 für Endsumme.
    Anhand dieses Wertes muss nun formatiert werden.
    Nun möchte ich aus Performance gründen ungern über alle Rows (können bis zu 2500 oder mehr sein) drüber rennen.

    Wie bekomm ich es nun hin das das ganze elegant und schnell geöst wird.
    Bei den Columns löse ich das Formatierungsproblem mit dem Event ColumnAdd, soetwas gibts für Rows aber nicht.

    Da gibt es nur RowsAdded, wobei in meinem Fall immer alle Rows auf einmal angefügt werden.
    Und wenn ich da über alle angefügten drüber renne, dauert das ewig.
    RowPostPaint habe ich auch schon ausprobiert, das wird allerdings jedesmal beim zeichnen der Form aufegrufen und nicht nur beim anlegen der Zelle.


    Hat jemand eine pfiffige Idee wie ich das lösen kann?



    Liebe Grüße
    Matthias

  • #2
    Hallo,

    es geht nicht ohne über alle Zeilen zu iterieren. Wenn du soviele Zeilen hast kann das DGV im virtuellen Modus verwendet werden. Dabei werden nur jeweils die Zeilen geladen die auch angezeigt werden.


    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Hallo Ecke,

      ist zwar schon ne weile her - geht aber auch ohne "selbst zu iterieren".
      Versuchs mit DGV_CellFormatting oder Painting.

      Wird zwar auch bei jeder Zelle aufgefrufen (spaltenweise), dürfte aber schneller sein als
      das selbst zu durchlaufen.

      Comment


      • #4
        Wenn Du über alle Zeilen drüber läufst würde ich das Neuzeichnen des Grids nach dem ändern jeder einzelnen Zeile abschalten.

        [highlight=c#]
        grid.SuspendLayout();

        foreach(DataGridViewRow row in grid.Rows)
        if(row.Cells[0].Value == 1)
        row.BackColor = Color.LightOrange;
        else
        row.BackColor = Color.LightBlue;

        grid.ResumeLayout();
        [/highlight]

        Damit wird nicht bei jeder Zeile das komplette Gitter neu gezeichnet, sondern nur einmal nachdem Du fertig bist.
        Der Code oben mag so nicht 100% laufen, habs nicht getestet. Aber ich denke Du verstehst was ich meine.

        Comment

        Working...
        X