Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
DataGridView Zeile einfärben
telfa
myCSharp.de - Member



Dabei seit:
Beiträge: 162
Herkunft: Rheinbach

Themenstarter:

DataGridView Zeile einfärben

beantworten | zitieren | melden

Hallo zusammen,
ich bin etwas verwirrt.
In einem DataGridView möchte ich in einer foreach-Schleife die Zeilen anhand eines Zellinhaltes einfärben.
Dazu habe ich folgenden Code erfasst:


            foreach (DataGridViewRow dgR in dgvRechnungen.Rows)
            {
                if (String.IsNullOrEmpty(dgR.Cells[7].Value.ToString()))
                    dgR.DefaultCellStyle.BackColor = Color.LightCoral;
                else
                    dgR.DefaultCellStyle.BackColor = Color.Green;

            }


Wenn ich im Debugmodus das zeilenweise durchgehe wird die Farbe auch gesetzt. Im Direktfenster habe ich auch schon einmal gezielt für eine Zelle Style.BackColor gesetzt. Aber die Anzeige bleibt weiß.
Hat hier einer eine Idee?

Vielen Dank und Gruß,
telfa

--------------------------

In einem zweiten Versuch habe ich jetzt in der Schleife jede Zelle eingefärbt.


            foreach (DataGridViewRow dgR in dgvRechnungen.Rows)
            {
                if (String.IsNullOrEmpty(dgR.Cells[7].Value.ToString()))
                    //dgR.DefaultCellStyle.BackColor = Color.LightCoral;
                    foreach (DataGridViewCell dgC in dgR.Cells)
                    {
                        dgC.Style.BackColor = Color.LightCoral;
                    }
                else
                    dgR.DefaultCellStyle.BackColor = Color.Green;

            }

Aber am Bildschirm bleibt alles weiß...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von telfa am .
private Nachricht | Beiträge des Benutzers
t2t
myCSharp.de - Member



Dabei seit:
Beiträge: 436
Herkunft: Hamburg

beantworten | zitieren | melden

Verwende für dein Vorhaben am besten das CellFormatting-Event und schaue dir das Code Beispiel am Ende mal an.
private Nachricht | Beiträge des Benutzers
telfa
myCSharp.de - Member



Dabei seit:
Beiträge: 162
Herkunft: Rheinbach

Themenstarter:

beantworten | zitieren | melden

Hallo t2t,

vielen Dank für die Antwort.
Das funktioniert mit dem Einfärben über das CellFormatting-Ereignis.
Was aber wenn ich Zellen/Spalten/Zeilen einfärben möchte nachdem das DGV angezeigt wurde? Ist dann ein Neuzeichnen erforderlich?

Gruß, telfa
private Nachricht | Beiträge des Benutzers
schnelleHelga
myCSharp.de - Member

Avatar #avatar-3513.gif


Dabei seit:
Beiträge: 84
Herkunft: Erzgebirge

beantworten | zitieren | melden

Hallo t2t,

wenn Deine Einfärbungen auf Cell-Änderungen beruhen, wird das Neuzeichnen automatisch veranlasst. Wenn Du "fremde" Zellen oder Zeilen färben willst, musst Du das selbst anstoßen/Auslösen.

schnelleHelga
private Nachricht | Beiträge des Benutzers
telfa
myCSharp.de - Member



Dabei seit:
Beiträge: 162
Herkunft: Rheinbach

Themenstarter:

beantworten | zitieren | melden

Hallo schnelleHelga,
danke Dir für die Info.

Gruß, telfa
private Nachricht | Beiträge des Benutzers
telfa
myCSharp.de - Member



Dabei seit:
Beiträge: 162
Herkunft: Rheinbach

Themenstarter:

beantworten | zitieren | melden

Hallo noch einmal,
die Anwender haben inzwischen bemängelt, dass die Zeilen sich nicht komplett einfärben.
Von schnelleHelga kam die Info das das Einfärben der Zellen angestoßen werden muss. Wie wird das Einfärben angestoßen?

Vielen Dank und viele Grüße,
Karl
private Nachricht | Beiträge des Benutzers
schnelleHelga
myCSharp.de - Member

Avatar #avatar-3513.gif


Dabei seit:
Beiträge: 84
Herkunft: Erzgebirge

beantworten | zitieren | melden

Hi Telfa,

ich würde in der RowPrePaint-Methode je nach Wunsch die Farbe für diese Zeile setzen, den Rest sollte dann CellPainting() selbst hinbekommen.
"Sonderwünsche" wie z.B. gestreifter Hintergrund musst Du selbst zeichnen (CellPainting).
Habe das gleiche Problem bei einer Anwendung für Kampfsportler gehabt. Dort sollte die Zeile nach Gürtelfarbe gezeichnet werden. Also orange/grün als Hintergrund. Habe ich dann selbst in CellPainting eingefügt.

schnelleHelga
private Nachricht | Beiträge des Benutzers
Cat
myCSharp.de - Member

Avatar #avatar-3070.jpg


Dabei seit:
Beiträge: 790

beantworten | zitieren | melden

Mittels


dataGridView.Invalidate();
kannst du das Neuzeichnen des DGV veranlassen.
Was meinst du mit "nicht komplett einfärben"? Hast du einen Rand um jede Cell?
private Nachricht | Beiträge des Benutzers
telfa
myCSharp.de - Member



Dabei seit:
Beiträge: 162
Herkunft: Rheinbach

Themenstarter:

beantworten | zitieren | melden

Hallo schnelleHelga, Hallo Cat

Vielen Dank für Eure schnelle Hilfe.
Das CellPainting werde ich mir einmal ansehen. Hatte noch keine Berührung damit.

Mit 'nicht komplett eingefärbt' ist die Zeile im Ganzen zu sehen. Mit CellFormating wurde bei Änderung in der DGV-Zelle wohl die betroffene, Zelle, nicht aber die ganze Zeile eingefärbt. Das wurde erst nachgeholt wenn eine andere Zeile berührt wird. Das reichte den Anwendern aber nicht...

Viele Dank und Gruß,
Karl
private Nachricht | Beiträge des Benutzers
schnelleHelga
myCSharp.de - Member

Avatar #avatar-3513.gif


Dabei seit:
Beiträge: 84
Herkunft: Erzgebirge

beantworten | zitieren | melden

hallo,

RowPrePaint

dort die Hintergrundfarbe setzen (für die Zeile, DGV.Rows[x].DefaultCellStyle.BackColor) und dann wird auch korrekt gezeichnet. Das Neuzeichnen wird bei Änderungen im DGV automatisch veranlasst. Wenn die Farbe anhand Ereignisse außerhalb des DGV reagieren soll, musst Du von Hand Neuzeichnen lassen.

schnelleHelga
private Nachricht | Beiträge des Benutzers
schnelleHelga
myCSharp.de - Member

Avatar #avatar-3513.gif


Dabei seit:
Beiträge: 84
Herkunft: Erzgebirge

beantworten | zitieren | melden

hier nochmal ein kurzer Beispielcode, färbt die Zeile in abhängigkeit eines Zellinhaltes.

     
 private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
        {
            try
            {
                // Zelle "kyu" enthält die Farbinformation
                int guertel = Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells["kyu"].Value);

                switch (guertel)
                {
                    case 1:
                        dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Brown;
                        break;
                    case 2:
                        dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Blue;
                        break;

erstellt einen Querstreifen in einer anderen Farbe
in der CellPainting-Methode:


                int streifen=e.CellBounds.Height/3;
                Rectangle newRect2 = new Rectangle(e.CellBounds.X, e.CellBounds.Y + streifen, e.CellBounds.Width, streifen);

und zeichnet den Hintergrund neu:


                        e.Graphics.FillRectangle(backColorBrush, e.CellBounds);
                        e.Graphics.FillRectangle(backColorBrush2, newRect2);

ein Invalidate() ist hier nicht notwendig.

gruß
schnelleHelga
private Nachricht | Beiträge des Benutzers
telfa
myCSharp.de - Member



Dabei seit:
Beiträge: 162
Herkunft: Rheinbach

Themenstarter:

beantworten | zitieren | melden

Hallo schnelleHelga,
noch einmal vielen Dank für den Beispielcode.
Habe das RowPrePaint-Event aufgenommen und die Zeilen werden jetzt auch farblich markiert.
Aber: da ist eine Endlosschleife, er verzweigt immer wieder in das Event immer mit dem kompletten DGV.
Das muss ich mir noch ansehen.

Viele Grüße,
Karl
private Nachricht | Beiträge des Benutzers
schnelleHelga
myCSharp.de - Member

Avatar #avatar-3513.gif


Dabei seit:
Beiträge: 84
Herkunft: Erzgebirge

beantworten | zitieren | melden

Hallo telfa,

der Aufruf erfolgt für jede Zeile Deines DGV. Wenn Du da 1000 Datensätze stehen hast, wird das auch 1000mal aufgerufen. Die Farbe muss ja für jede Zeile gesetzt werden.
Die Endlos-Schleife liegt eventuell am Debugger?
Die RowPrePaint-Methode ist mit dem Debugger natürlich "endlos", wenn Du Deine Anwendung nicht direkt auf dem Bildschirm hast. Holst Du das Fenster in den Vordergrund, startet das Zeichnen natürlich erneut.

schnelleHelga
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2361

beantworten | zitieren | melden

Ganz wichtig: Jedes verschieben / verdecken des Grids führt dazu, dass für die gewählte Zeile das "RowPrePaint" ausgeführt wird. Daher wird das Gefühl der Endlosschleife kommen. Das Überfahren mit der Maus reicht aus meiner Erfahrung schon zu um das Grid zu veranlassen die Zeile neu zu zeichnen.
Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers