Laden...

DataGridView Zeile einfärben

Erstellt von telfa vor 9 Jahren Letzter Beitrag vor 9 Jahren 7.956 Views
T
telfa Themenstarter:in
156 Beiträge seit 2012
vor 9 Jahren
DataGridView Zeile einfärben

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ß...

T
415 Beiträge seit 2007
vor 9 Jahren

Verwende für dein Vorhaben am besten das CellFormatting-Event und schaue dir das Code Beispiel am Ende mal an.

T
telfa Themenstarter:in
156 Beiträge seit 2012
vor 9 Jahren

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

82 Beiträge seit 2014
vor 9 Jahren

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

T
telfa Themenstarter:in
156 Beiträge seit 2012
vor 9 Jahren

Hallo schnelleHelga,
danke Dir für die Info.

Gruß, telfa

T
telfa Themenstarter:in
156 Beiträge seit 2012
vor 9 Jahren

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

82 Beiträge seit 2014
vor 9 Jahren

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

771 Beiträge seit 2009
vor 9 Jahren

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?

T
telfa Themenstarter:in
156 Beiträge seit 2012
vor 9 Jahren

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

82 Beiträge seit 2014
vor 9 Jahren

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

82 Beiträge seit 2014
vor 9 Jahren

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

T
telfa Themenstarter:in
156 Beiträge seit 2012
vor 9 Jahren

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

82 Beiträge seit 2014
vor 9 Jahren

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

2.298 Beiträge seit 2010
vor 9 Jahren

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 |